Задать вопрос
@Eugene-Kei

Как подгрузить связи в коллекции ресурсов laravel одним запросом?

Хочу сделать возможность для апи указывать в get параметре некоторые связи, которые могут быть нужны клиенту.
Например, при получении постов указать, что нужны так же и авторы этих постов.
Изначально это нужно было только для списка ресурсов аля get /posts. Сделал отдельный класс фильтрации, через который прогоняется Post::query() и в зависимости от параметров get в объекте Request к запросу добавляются условия выборки, сортировки и внешних связей. В целом работает нормально.
Потом появилась необходимость получать связи и при получении одного, конкретного ресурса (get /posts/123).
В метод show контроллера сразу приходит готовая модель нужного поста, если таковой имеется.
class PostController  extends Controller
{
    public function index(Request $reqquest)
    {
        //...
    }

    public function show(Request $request, Post $post)
    {
        //...
    }
}

Если в случае с методом index я работаю с \Illuminate\Database\Eloquent\Builder и добавляю условия выборки связей в него, то в случае с методом show у меня уже готовая модель и работать нужно с ней.

Я хочу сделать один обработчик, который будет определять, какие связи нужны и во всех случаях использовать его. Посмотрел JsonResource. Для отдельного поста можно добавлять подключение связей при необходимости. Но если сделать это для коллекции из 50 - 100 постов, то получаем 50 - 100 дополнительных запросов к базе. Если бы можно было подгрузить связи одним запросом для всей коллекции из дочерних классов JsonResource, то получилось бы удобно. Я бы не добавлял связи в Builder а использовал бы только ресурсы.

Собственно, есть ли в ларке встроенные примочки для этого? Чтобы велосипеды не городить.
Или может есть, какие-то более разумные подходы, которых я не вижу? Лару недавно изучаю, многого не знаю еще.
  • Вопрос задан
  • 409 просмотров
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@jazzus
В контроллере
public function show(Post $post)
{
  $post->load('relations');
   ...
}

В ресурсе
'relations' => RelationResource::collection($this->relations)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы