仍然在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
答案 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);