【问题标题】:What's the advantage of using Laravel Eloquent Relationship queries?使用 Laravel Eloquent 关系查询有什么好处?
【发布时间】:2018-01-19 16:08:41
【问题描述】:

所以我试图通过实现雄辩的关系来改进我的查询。 假设我有一个 threads 表,每个线程都有 replies

我需要的是一个包含所有回复数组的线程信息的 JSON 对象。

目前,我可以用这个实现我想要的。

public function show($threadId){
        $threads = ThreadView::find($threadId);
        $threads->replies = ReplyView::where('threadId', $threadId)->get();
        return response()->json($threads, 200);
    }

有了雄辩的关系,我可以用这样的东西达到同样的效果。

public function show($threadId) {

    $threads= ThreadView::find($threadId);
    $threads->replies= ThreadView::find($threadId)->Replies;

    return response()->json($threads, 200);
}

使用关系有什么好处吗?在我看来,它们都一样。

【问题讨论】:

  • 渴望加载是雄辩的地方,imo。使查询相关数据变得轻而易举。此外,它在代码中的可读性很好。
  • 如果我没记错的话,如果您没有将回复定义为关系,并最终保存了您的线程,它将尝试保存“回复”字段并且会爆炸。因为当你查询一个关系时,它不是存储在属性中,但是如果你没有定义关系并使用$threads->replies = ...,它会将它存储为一个属性

标签: php database laravel eloquent


【解决方案1】:

使用 Eloquent,您可以更短地执行此操作:

public function show($threadId) {
    $threads = ThreadView::with('replies')->find($threadId);
    return response()->json($threads, 200);
}

with 函数将立即加载关系,而无需您编写查询。

这就是 Eloquent 的优势,它会为您编写查询。无需为您创建连接查询或额外查询。

【讨论】:

  • 感谢您的回答!这就是我真正想要的。
  • 很高兴我能帮上忙。请考虑将此答案标记为您的问题的解决方案,这样其他用户也可能会发现此问题。 :)
【解决方案2】:
public function show($threadId) {

    $threads= ThreadView::with('replies')->find($threadId);

    return response()->json($threads, 200);
}

主要优点是使用这样的关系,第一个示例执行 2 次选择(它抓取 100% 的 ThreadView,然后抓取 100% 的 ReplyView),而第二个示例只执行 1 次查询。

第二个优势是,与其他人相比,Eloquent 在延迟加载方面做得非常好,如果您不是 SQL 查询专家,使用它会更好。

放弃 Eloquent 模型并直接使用 DB Builder 将快大约 500 倍,而且我发现代码更清晰。这可能就是你要找的。

但是,如果您使用模型,请使用关系!

【讨论】:

  • 第二个函数不是也做了两次查询吗?
  • Da,mmi.t 我的脑海中真的出现了with 的幻觉。很好的代码审查,兄弟!
  • 感谢您的回答!
猜你喜欢
  • 2013-10-03
  • 2017-07-19
  • 1970-01-01
  • 2021-09-25
  • 2015-01-21
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多