Laravel排序子关系集合

时间:2018-12-07 05:34:11

标签: php laravel eloquent

我有以下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->seriesstatus->order_number进行排序?如果它可以写在模型上,那么每个命令只写一次控制器吗?

有没有我可以使用的代码,例如:

$movie->series->sortBy('status.order_number');

1 个答案:

答案 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');