[英]Laravel sort child relationship collection
我有以下3表:
電影
- ID
系列
- ID
-status_id
-movie_id
狀態
- ID
- 訂單號
這是控制器上的代碼:
$movie = Movie::where('slug', $slug)->with(['series'])->first();
這是用於查看的代碼:
@foreach ($movie->series as $series)
{{ $series->name}}
@endforeach
如何排序$movie->series
基於status->order_number
? 如果它可以寫在模型上,那么每個訂單只寫一次控制器?
有沒有我可以使用例如這樣的代碼:
$movie->series->sortBy('status.order_number');
是的,但是您需要與系列加入狀態:
$movie = Movie::where('slug', $slug)->with([
'series' => function ($query) {
// Subquery on `series` table
return $query
// select whatever you'll need
->select('series.*')
// join with status
->join('status', 'series.status_id', '=', 'status.id')
// order by order number
->orderBy('status.order_number')
// * you can drop this if you select all the fields you need and use those
->with('status');
},
])->first();
編輯此^方法將在SQL級別上進行排序,但是您也可以使用集合進行此操作:
@foreach ($movie->series->sortBy('status.order_number') as $series)
{{ $series->name}}
@endforeach
在這種情況下也添加.status
到您with
避免n + 1個問題: ->with(['series.status'])
您的嘗試不起作用的原因是->sortBy(..)
不會對集合進行突變,它只會返回一個新的已排序的集合。 這將工作:
$movie->series = $movie->series->sortBy('status.order_number');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.