2014-10-03 103 views
0

我有一個Album模型。 Album可以有許多Event和許多Picture,但Event屬於一個Album和一個Picture也屬於一個AlbumLaravel:渴望加載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

您是否嘗試過類似$事件::用([ '相冊'=>函數($ Q) {$ Q->與( '圖片') - > orderByRaw( 'RAND()') - >取(2); }]); – cubiclewar 2014-10-03 00:52:46

+0

您不能在預先加載的查詢中使用'take'來爲每個相冊加載2張圖片,它會將所有圖片限制爲2.請閱讀以下內容:http://softonsofa.com/tweaking-eloquent-relations-how-to-get -n-related-models-per-parent/ – 2014-10-03 07:21:13

+0

@cubiclewar不幸的是我得到了'調用未定義方法Illuminate \ Events \ Dispatcher :: with()' @JarekTkaczyk哇,這似乎很痛苦!所有這些代碼只是爲了查詢一些關係?你確定沒有簡單的方法來做到這一點? – Flobesst 2014-10-03 15:05:29

回答

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 2014-10-03 14:56:32

+0

對不起!我沒有得到你現在要求的,現在做了什麼? – 2014-10-03 18:36:09

+0

假設我有3個事件要顯示,並且我想爲每個事件顯示2個圖片。如果我在上面的查詢中使用' - > take(2)',則只有一個事件會顯示2張圖片,其他圖片是空的。 – Flobesst 2014-10-04 02:23:53