Laravel: загружаем последнюю дочернюю модель для каждого родителя

Допустим, у нас есть модель Фотоальбом, и мы для списка альбомов хотим загрузить (eager load) превью каждого в виде последней фотографии. Казалось бы, это можно сделать так:


  $albums = Album::with(['photos' => function ($query) {
    $query->take(1);
  }])->get();

Однако такой запрос прикрепит одну фотографию лишь к одному альбому, а к остальным — нет. Тот же эффект будет, если вместо

take(1)
использовать
latest()
.
Чтобы добиться желаемого результата, нужно в модели альбома объявить еще одно отношение:


  public function latestPhoto() {
    return $this->hasOne('Photo')->latest();
  }

Тогда вот такой запрос:


  $albums = Album::with('latestPhoto')->get();

позволит нам получить то, что нужно.

Комментарии