我有Question
和Answer
模型。hasMany回答了这个问题。在php artisan tinker
模式下运行的以下命令无缘无故地调用数据库查询:
$q = new Question;
$q->answers[] = new Answer; // invokes the below query
// the executed query
select * from `answers` where `answers`.`question_id` is null and `answers`.`question_id` is not null
正如您所看到的,不需要任何数据库调用。我怎样才能阻止它?
发布于 2016-05-01 13:20:42
之所以这样做,是因为要将它分配给Question
对象。它想知道你是否在添加一个现存的记录引用。All Laravel雄辩的模型包含了用于属性的神奇方法,并且尝试将它们用作临时数据存储是一个非常糟糕的想法,除非您已经提前为该特定目的在它们上定义了一个属性。
只需使用一个常规数组,然后在模型准备好之后再将它们关联起来。
关于一对多关系的文档:
https://laravel.com/docs/5.1/eloquent-relationships#one-to-many
发布于 2016-05-01 13:25:38
当您执行$q->answers
时,Laravel尝试加载问题对象上的所有答案--不管它们是否存在。
当您访问模型实例上的关系时,可以像调用answers()
一样调用它并获得查询生成器,或者可以像answers
一样调用它而不带括号,而Laravel将根据该关系为您获取一个集合。
您可以很容易地通过这样做来防止这种情况:
$q = new Question;
$a = new Answer;
然后,当你准备好拯救他们的时候,把他们联系在一起。最简单的形式如下:
$q->save();
$q->answers()->save($answer);
https://stackoverflow.com/questions/36967086
复制相似问题