2014-10-03 140 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