在Laravel 4中过滤急切加载的数据

时间:2013-08-05 16:26:37

标签: laravel laravel-4 eloquent

我有以下设置:

俱乐部提供特定类型的活动,因此有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。也很公平。但我需要应用更多过滤。活动可能未处于正确状态(它可能在数据库中作为草稿条目或已过期),因此我需要能够仅获取活动和将来活动的活动类型。

此时我迷路了...有没有人有任何处理这个用例的建议?

由于

2 个答案:

答案 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)` 

查询将按预期运行。