Laravel sort коллекция отношений с детьми - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть следующие 3 таблицы:
Фильм
- идентификатор
Серия
- идентификатор
- 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');

1 Ответ

0 голосов
/ 07 декабря 2018

Да, но вам нужно объединить статус с сериями:

$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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...