我有以下3张桌子:
电影
-id
系列
-id
-status_id
-movie_id
状态
-id
-order_number
这是控制器上的代码:
$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');
答案 0 :(得分:1)
是的,但是您需要与系列加入状态:
$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');