2013-08-05 72 views
0

我有以下设置:过滤渴望加载数据4

俱乐部提供的活动,这是一种特殊类型的,所以3机型的关系:

俱乐部:

function activities() 
{ 
    return $this->hasMany('Activity'); 
} 

活动:

function club() 
{ 
    return $this->belongsTo('Club'); 
} 

function activityType() 
{ 
    return $this->hasMany('ActivityType'); 
} 

ActivityType:

function activities() 
{ 
    return $this->belongsToMany('Activity'); 
} 

因此,例如Club Foo可能会有一个名为“Triathlon”的活动,该Activity具有ActivityTypes“游泳”,“跑步”和“自行车”。

这已经够用了,但我需要在Club页面上显示ActivityTypes列表 - 基本上只是一个列表。所以我需要获取所有相关活动的ActivityTypes。

我能做到这一点,像这样从接收的俱乐部模型的实例的控制方法:

$data = $this->club->with(array('activities', 'activities.activityTypes'))->find($club->id) 

这让我与有关他们ActivityTypes沿着所有相关活动的对象。也够公平的。但我需要应用更多的过滤。活动可能不是正确的状态(它可能在数据库中作为草稿条目或已过期),所以我需要能够仅获取活动的活动类型,这些活动类型将在现场和未来进行。

在这一点上我迷路了...有没有人有任何建议来处理这个用例?

感谢

回答

1

要筛选,您可以使用where()作为流利的数据库查询:

$data = Club::with(array('activities' => function($query) 
{ 
    $query->where('activity_start', '>', DB::raw('current_time')); 

}))->activityType()->get(); 

其中担任灵感这种情况的例子是在laravel文档,检查本节结束:http://laravel.com/docs/eloquent#eager-loading

(代码不是测试,我已经采取了一些自由与财产的名字:)!)

0

我认为如果你第一次约束你的活动关系,与它们相关的活动类型也会自动受到限制。

所以我会做的是

function activities() 
{ 
    return $this->belongsToMany('Activity')->where('status', '=', 'active'); 
} 

,然后你

$data = $this->club->with(array('activities', 'activities.activityTypes'))->find($club->id)` 

查询将努力为您期望的那样。

+0

谢谢 - 我采用了不同的答案,因为您建议的方法意味着我只能通过activities()模型方法检索活动活动。使用过滤器意味着我还可以获得状态为“挂起”或其他任何状态的人。 –