我有以下设置:
俱乐部提供特定类型的活动,因此有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可能只有一个名为“铁人三项”的活动,该活动的活动类型为“游泳”,“跑步”和“骑自行车”。
这很公平,但我需要在俱乐部页面上显示一个ActivityTypes列表 - 基本上只是一个列表。所以我需要获取所有相关活动的ActivityType。
我可以通过接收Club模型实例的控制器方法这样做:
$data = $this->club->with(array('activities', 'activities.activityTypes'))->find($club->id)
这让我得到了一个包含所有相关活动的对象以及与它们相关的ActivityTypes。也很公平。但我需要应用更多过滤。活动可能未处于正确状态(它可能在数据库中作为草稿条目或已过期),因此我需要能够仅获取活动和将来活动的活动类型。
此时我迷路了...有没有人有任何处理这个用例的建议?
由于
答案 0 :(得分: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
(代码未经过测试,我对属性名称采取了一些自由!:))
答案 1 :(得分:0)
我认为如果您首先约束您的活动关系,那么与它们相关的活动类型也会自动受到限制。
所以我要做的是
function activities()
{
return $this->belongsToMany('Activity')->where('status', '=', 'active');
}
然后你的
$data = $this->club->with(array('activities', 'activities.activityTypes'))->find($club->id)`
查询将按预期运行。