【问题标题】:Filtering eager-loaded data in Laravel 4在 Laravel 4 中过滤预先加载的数据
【发布时间】:2013-08-05 16:26:36
【问题描述】:

我有以下设置:

俱乐部提供特定类型的活动,因此有 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 列表 - 基本上只是一个列表。所以我需要获取所有相关Activity的ActivityTypes。

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

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

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

此时我迷路了……有人对处理这个用例有什么建议吗?

谢谢

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案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

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

    【讨论】:

      【解决方案2】:

      我认为如果你首先约束你的活动关系,与它们相关的活动类型也会被自动约束。

      所以我会做的是

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

      然后是你的

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

      查询将按照您的预期工作。

      【讨论】:

      • 谢谢-我选择了不同的答案,因为您建议的方法意味着我只能通过活动()模型方法检索活动活动。使用过滤器意味着我还可以获得状态为“待定”或其他任何状态的那些。
      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2020-02-27
      • 2019-06-05
      • 2019-03-26
      相关资源
      最近更新 更多