2014-10-03 3 views
0

У меня есть модель Album. A Album может иметь много Event и много Picture, но Event принадлежит к одному Album и одному Picture принадлежит к одному Album.Laravel: Искренняя загрузка с 3 "отношениями"

Я пытаюсь составить список событий. В каждом случае я хотел бы отобразить название альбома и 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; 

    } 

} 

Это работает, но я должен начать с событий, а не альбомы. Я не знаю, как заставить все эти отношения работать вместе. Событие -> Альбом -> Изображения и отображение их в виде.

+0

Вы пробовали что-то вроде $ Event :: с ([ 'Альбом' => функция ($ д) { $ q-> с ('Picture') -> orderByRaw ('RAND()') -> взять (2); }]); – cubiclewar

+0

Вы не можете использовать 'take' на загруженном запросе для загрузки 2 снимков на альбом, это ограничит все снимки до 2. Прочтите это: http://softonsofa.com/tweaking-eloquent-relations-how-to-get -n-related-models-per-parent/ –

+0

@cubiclewar, к сожалению, я получаю 'Call to undefined method Illuminate \ Events \ Dispatcher :: with()' @JarekTkaczyk ничего себе, это кажется очень болезненным! Весь этот код просто запрашивает некоторые отношения? Вы уверены, что нет простого способа сделать это? – Flobesst

ответ

0

Тогда вам нужен 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 
+0

Спасибо за ваш ответ, я обновил свой код, чтобы работать с вашим решением. Но у меня все еще есть проблема: когда я делаю '$ query-> orderByRaw (" RAND() ") -> take (2);', чтобы показать только 2 альбома на одно событие (как в моем первом сообщении), я получаю только 2 снимка для ВСЕХ событий. Только последнее событие в списке будет иметь 2 картинки, а не другие ... – Flobesst

+0

Извините! я не получил то, что вы просили сейчас, что он теперь делает? –

+0

Предположим, что у меня есть 3 события для отображения, и я хочу показать 2 снимка за событие. Если я использую '-> take (2)' в запросе, как я сказал выше, только одно событие покажет 2 изображения, другие пустые. – Flobesst

Смежные вопросы