我有以下代码:
$comments = Comment::with('user.country')
->limit(200)
->get(['id', 'comment', 'user_id'])
我添加了一个检索到的观察者,以在原始评论中添加一些内容。在某种程度上这样:
public function retrieved(Comment $comment)
{
$comment_country = $comment->user->country->name;
}
问题是,即使我已经使用with('user.country')
加载了用户和国家/地区,该注释也没有用户或国家/地区对象,因此我的200条注释中的每条都命中了数据库。
我已经在没有观察者的情况下测试了此代码,并且确实获得了用户和国家(地区)对象。关于如何强制观察者使用已经加载的用户和国家/地区的任何想法,因为现在它只是创建了整个nu对象?
答案 0 :(得分:1)
这里发生了1个以上的查询。您需要知道快速加载的顺序。
查询Comment
的基本记录集,并通过水合作用将结果集填充到模型中(导致retrieved
被解雇)。然后,通过从这些模型中收集所有需要的键,然后进行查询以获取子级,来完成快速加载。当结果返回时,孩子们就会和父母重新配对。
如果您遵循此说明,则会在对急切的负载进行查询之前就检索注释并将其水化。因此,由于尚未查询到它们之间的关系,因此不会期望它。
一旦从查询生成器中合并模型,就会触发retrieved
事件。
答案 1 :(得分:0)
您完全正确,没有在检索结果中执行此操作。我的解决方案如下。我已从获取国家名称的观察员中删除了代码,并执行以下操作:
protected $visible = ['id', 'name'];
protected $appends = ['country'];
和
public function getCountryAttribute()
{
return $this->user->country->name;
}
与之完美配合
$comments = Comment::with('user.country')
->limit(200)
->get(['id', 'comment', 'user_id'])
请注意,我的此解决方案着重于我随后将此信息显示为json的事实。