如何在Laravel中通过一个SQL请求创建子项?

时间:2018-04-24 05:40:29

标签: laravel eloquent

如果作者有很多书("一对多"关系),我想通过$author_id创建一个孩子,我应该这样做:

$author = Author::find($author_id);
$author->books()->create([...]);

但是这段代码产生了两个SQL请求:

Author::find($author_id)->books()->create([...]);

为了减少SQL请求的数量,我应该将author_id字段添加到我的Book模型的$fillable数组中,并执行以下操作:

Book::create([
    'author_id' => $author_id,
    ...
]);

哪种方法更好?至于我,第一个看起来更正确,更有说服力的方式,但对于这种简单的情况,2个SQL请求太多了。有没有其他方法只需要一个SQL请求而不触及$fillable数组?

1 个答案:

答案 0 :(得分:0)

旧学校:

$book = new Book;
$book->author_id = $author_id;
//...
$book->save();

或者你可以绕过可填写的forceCreate

Book::forceCreate(['author_id' => $author_id, ...]);

至于哪种方法更好:如果你知道author_id,那么第二(不使用关系)。但根据我的经验,这种情况很少发生,因为您通常想检查相关模型是否确实存在。但如果您对输入的正确性有信心,则无需进行2次查询。