2013-11-27 86 views
5

仍然在Laravel 4中找到我的腳,我有點不確定爲什麼這不起作用。Laravel 4 - 在使用hasMany關係時插入多條記錄

在L3我是能夠插入多條記錄的表是這樣的...

$comments = array(
    array('message' => 'A new comment.'), 
    array('message' => 'A second comment.'), 
); 

$post = Post::find(1); 

$post->comments()->save($comments); 

但是當我現在做類似的或者被插入,而不外鍵的記錄,像這樣.. 。

$comments = array(
    array('message' => 'A new comment.'), 
    array('message' => 'A second comment.'), 
); 

$post = Post::first(); 

$post->comments()->insert($comments); 

或(和經過一些谷歌搜索),我嘗試以下方法,並得到一個preg_match() expects parameter 2 to be string, array given

$comments = new Comment(array(
    array('message' => 'A new comment.'), 
    array('message' => 'A second comment.'), 
)); 

$post = Post::first(); 

$post->comments()->save($comments); 

以及我試過...->saveMany()...->associate(),但我和最後一個例子有相同的問題。

在旁註中,我意識到我已將多維數組包裹在一個對象中,但似乎是正確的方法。我嘗試過但沒有做,但也失敗了。

我應該指出,我正在通過工匠運行種子命令。

編輯: 這是從日誌文件的完整preg_match錯誤

[2013-11-27 16:43:39] log.ERROR: exception 'ErrorException' with message 'preg_match() expects parameter 2 to be string, array given' in /Applications/MAMP/htdocs/project/www/bootstrap/compiled.php:6315

回答

15

save()需要一個單一的模型,saveMany()期望的模型的陣列,而不是數據的assoicative陣列。

但是saveMany()不會插入一個查詢,它實際上會循環通過模型並逐個插入(注意:L3也是這樣做的)。

如果您需要插入更大的記錄集,請不要使用ORM,請使用查詢構建器,Manuel Pedrera如何編寫第一個示例代碼。

只是爲了在這裏記錄的是你將如何使用saveMany()

$post = Post::find(1); 

$comments = array(
    new Comment(array('message' => 'A new comment.')), 
    new Comment(array('message' => 'A second comment.')), 
); 

$post->comments()->saveMany($comments); 
+0

saveMany()會導致很多正在執行的SQL查詢,可能會降低性能,請使用insert(),只需傳入不帶'new Comment'的簡單數組,插入將不會觸及父級。 –

+0

爲什麼Laravel不夠聰明只是'更新註釋SET post_id = 10 where id in(3,6,23,56)'?似乎很微不足道...... –

+0

如果您使用交易來提高性能,該怎麼辦? – malhal

17

這可能不是,你在尋找什麼,因爲它不是用雄辯的,但它應該得到你的種子完成。您可以使用DB::insert(),像這樣:

$postId = 1; 

DB::table('comments')->insert(array(
    array(
     'message' => 'A new comment.', 
     'post_id' => $postId), 
    array(
     'message' => 'A second comment', 
     'post_id' => $postId 
    ), 
)); 

作爲替代方案,你可以做到這一點使用口才太,但它應該以相反的方式來完成:設置在「孩子的」相關模型。這是官方文件說:

關聯模型(屬於)

當更新屬於關聯關係,您可以使用關聯 方法。這種方法將設置子模型

我認爲這是做這樣的外鍵,因爲在數據庫中,「兒童」模式是其中包含的外鍵「父」之一(在這種情況下, ,post_id)。

代碼應該是這樣的:

$post = Post::find(1); 

$comments = array(
    array('message' => 'A new comment.'), 
    array('message' => 'A second comment.'), 
); 

foreach ($comments as $commentAttributes) { 
    $comment = new Comment($commentAttributes); 
    $comment->post()->associate($post); 
    $comment->save(); 
} 
+0

感謝您的答覆。我希望能找到類似於L3工作方式的解決方案,但爲了時間的原因,我使用了您的關聯示例。 – LiquidB

+0

很高興你能工作。然後,您可以通過將其中一個答案標記爲有效來解決問題。 –