2015-09-28 60 views
1

我正在嘗試創建一個遷移,以創建新列並使用現有列中的數據填充它。Laravel遷移 - 創建從現有列中填充的新列

我想將名稱列變成一個slug(使用幫助函數)並將其保存在一個slug列中。

我試過,但沒有運氣:

public function up() 
{ 
    Schema::table('teams', function(Blueprint $table) 
    { 
     // 
     $table->string('slug', 100); 
    }); 

    $teams = DB::table('teams')->get(); 

    foreach ($teams as $team) 
    { 
     $team->slug = str_slug($team->name, "-"); 
     $team->save(); 
    } 
} 

我是不是白癡?我可以做這個工作嗎?

感謝

+0

收到錯誤'調用未定義的方法stdClass :: save()'我如何保存更改? –

回答

3

假設你有一個Team模型:

$teams = App\Team::all(); 

foreach($teams as $team) { 
    $team->slug = str_slug($team->name, "-"); 
    $team->save(); 
} 

你試圖在實際使用查詢生成器代碼使用ORM雄辯的語法($team->save)。你最好選擇一個或另一個(ORM或查詢構建)。我的版本使用雄辯的ORM。當然你也可以使用查詢生成器語法一路,就像這樣:

$teams = DB::table('teams'); 
foreach($teams as $team) { 
    DB::table('teams') 
      ->where('id', $team->id) 
      ->update(['slug' => str_slug($team->name)]); 
} 

而且基本上是一個查詢生成器選擇命令(如$teams = DB::table('teams');)將返回stdClass的對象的數組(這已經不是「救」的方法),而Eloquent ORM select將返回指定模型的對象集合,它們具有「保存」方法。

+0

給那個男人一個餅乾! –

+0

你會介意解釋爲什麼你的版本與我的版本相反(把它放在你的答案中)。是因爲我的結果,而不是對象?對我和其他任何可能絆倒這個答案的人都有用! –

+1

我剛更新了答案。 – Amarnasan

1

您沒有使用name列,但(空)slug。試試這個:

$team->slug = str_slug($team->name, "-"); 
+0

偉大的一點!改變了,並讓我對下一個錯誤(現在在評論中) –

+1

值得一分的偉大點「這個答案很有用」? – Amarnasan

+0

;) - 抱你的馬! –