У меня есть Album
модель. Album
может иметь много Event
и много Picture
но Event
принадлежит одному Album
и один Picture
принадлежит одному Album
тоже.
Я пытаюсь составить список событий. В каждом случае я хотел бы отобразить название альбома и 3 случайных изображения из этого альбома.
Я думаю, что для этого мне нужно использовать Eager Loading, но я немного запутался. В настоящее время я могу иметь список альбомов и сделать из них 3 случайных изображения, например:
$albums = Album::with(array('pictures' => function($query) {
$query->orderByRaw("RAND()")->take(2);
}))->get();
foreach ($albums as $album) {
echo $album->title;
foreach ($album->pictures as $picture) {
echo $picture->filename;
}
}
Это работает, но я должен начать с событий, а не альбомов. Я не знаю, как заставить все эти отношения работать вместе. Событие -> Альбом -> Изображения и отобразить их в виде.
Тогда вам нужно one-to-many
отношения и вам нужно создать методы отношений для обеих сторон, например:
В Event
модель:
public function album()
{
return $this->belongsTo('Album', 'album_id');
}
В Album
модель:
public function events()
{
return $this->hasMany('Event', 'album_id');
}
public function pictures()
{
return $this->hasMany('Picture', 'album_id');
}
Итак, теперь вы можете начать с Event
, например:
$events = Event::with('album.pictures')->get(); // or paginate(10), 10 per page
Других решений пока нет …