Laravel“已取回”的观察者删除了我的对象关系

时间:2018-08-02 22:51:23

标签: php laravel eloquent

我有以下代码:

$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对象?

2 个答案:

答案 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的事实。