0

我有以下设置:

俱乐部提供特定类型的活动,因此有 3 个具有关系的模型:

俱乐部:

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

活动:

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

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

活动类型:

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

例如,Club Foo 可能有一个名为“Triathlon”的 Activity,并且该 Activity 具有 ActivityTypes“游泳”、“跑步”和“自行车”。

这很公平,但我需要在俱乐部页面上显示 ActivityTypes 列表 - 基本上只是一个列表。所以我需要获取所有相关活动的 ActivityTypes。

我可以从接收 Club 模型实例的控制器方法中这样做:

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

这让我得到了一个包含所有相关活动以及与之相关的活动类型的对象。也足够公平。但我需要应用更多过滤。活动可能不处于正确状态(它可能在数据库中作为草稿条目或已过期),因此我需要能够仅获取活动的活动类型以及未来活动。

在这一点上我迷路了......有人对处理这个用例有什么建议吗?

谢谢

4

2 回答 2

1

要过滤,您可以where()在 fluent DB 查询中使用 as:

$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

(代码未经测试,我对属性名称采取了一些自由!:))

于 2013-08-05T16:59:43.377 回答
0

我认为,如果您首先限制活动的关系,与它们相关的活动类型也会自动受到限制。

所以我会做的是

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

然后你的

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

查询将按您的预期工作。

于 2013-08-05T19:59:53.147 回答