Laravel 嵌套关系上的预加载

Laravel Eager Loading on nested relationship

我有一个具有 child 关系的 parent 模型,我正试图通过与 child 的另一种关系进行排序。

Plan
-- Items
--- Details

计划到项目是一对多的关系。 Items to Details 是一对一的关系。我希望项目按在详细信息中设置的字段排序,例如标题。 I was thinking that it would look something like in this article.

Plan::with([
  'items.details' => function ($query) {
      $query->orderBy('title', 'asc');
}])
->findOrFail(1);

没用。我已经看到很多关于如何将它添加到 Parent(计划)模型的方法,但我想订购一种关系——而不是 parent,尤其是因为它只有 1 个计划。我确定有一个简单的解决方案,但我无法全神贯注。

由于title来自另一个table detailsitemsdetails的关系是一对一的,你可以像这样使用 leftjoin

Plan::with([
  'items' => function ($query) {
      $query->leftjoin('details', 'details.item_id', '=', 'items.id')
            ->select('items.*', 'details.title')
            ->orderBy('title', 'asc');
}])
->findOrFail(1);

我不知道其他人是否会 运行 进入这个问题。 TsailKoga 的答案确实有效,但 collection 很有趣。就像关系被推到 parent。例如。

Plan (parent)
-- Items 
--- Details

所有详细信息属性都成为项目的一部分。它有效但不是我想要的结果。我尝试做一些时髦的 usort,但是一旦您将 collection 转换为数组以与 usort 一起使用,您将失去与 collections/eloquent 一起使用的所有工具。我找到了一种不需要任何花哨的方法。 Collections 有一个 sortBy 方法。我所要做的就是 $plan->items->sortBy('details.title') 和中提琴之类的东西。计划项目按标题排序。 1 行代码的工作天数。

我希望这对其他人有所帮助。