Laravel 4 - 使用hasMany关系时插入多个记录

时间:2013-11-27 16:39:35

标签: laravel laravel-4

仍然在Laravel 4中找到我的脚,我有点不确定为什么这不起作用。

在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);

除了...->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

2 个答案:

答案 0 :(得分:17)

这可能不是您正在寻找的,因为它不使用Eloquent,但它应该让您的种子完成。您可以使用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
    ),
));

作为替代方案,您也可以使用Eloquent执行此操作,但应以相反的方式完成:在" childs"中设置相关模型。这是官方文档所说的:

  

关联模型(属于)

     

更新belongsTo关系时,您可以使用该关联   方法。此方法将在子模型上设置外键

我认为这样做是因为在数据库中,"孩子" model是包含" parent"的外键的那个。 (在这种情况下,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();
}

答案 1 :(得分:15)

save()期望单个模型,saveMany()需要一组模型,而不是数据的辅助数组。

但是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);