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 details
,items
和details
的关系是一对一的,你可以像这样使用 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 行代码的工作天数。
我希望这对其他人有所帮助。
我有一个具有 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 details
,items
和details
的关系是一对一的,你可以像这样使用 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 行代码的工作天数。
我希望这对其他人有所帮助。