Laravel 4.1通过模型关系显示最近30天的条目

时间:2014-05-04 18:57:08

标签: php laravel eloquent

我正在使用Laravel 4并有两个模型:项目和任务。 我的Project.php是

class Project extends \Eloquent {
    protected $guarded = [];

    public function tasks()
    {
        return $this->hasMany('Task');
    }
}

我的Task.php是

class Task extends \Eloquent {
    protected $guarded = [];

    public function project()
    {
        return $this->belongsTo('Project');
    }
}

直到现在都很标准的东西。

现在我要显示最近30天。我正在使用nesbot / Carbon,我可以这样做:

 $projects = Project::with('tasks')->where('created_at', '>', Carbon::now()->subDays(30))->get();

但这会显示过去30天内的项目,但我想显示过去30天内的任务。在Laravel.io聊天中,我得到了使用它的建议:

 $projects = Project::with(['tasks' => function($query) { $query->where('created_at', '>', Carbon::now()->subDays(30)); }]);

但这也不起作用。

我很感激有关如何在过去30天内访问任务的建议,同时使用我通常在我的控制器中执行的模型关系。

乔治:)

2 个答案:

答案 0 :(得分:6)

您需要使用whereHas将约束转移到主项目查询。

$constraint = function($query) {
    $query->where('created_at', '>', Carbon::now()->subDays(30));
};

Project::with(['tasks' => $constraint])
    ->whereHas(['tasks' => $constraint])
    ->get();

请注意,如果要显示所有项目的任务,可以删除with()。

这有点低效,可以通过使用连接而不是whereHas来改进,但应该让你开始。

答案 1 :(得分:0)

实际上Laravel聊天的答案是正确的:

 $projects = Project::with(['tasks' => function($query) { $query->where('created_at', '>', Carbon::now()->subDays(30)); }]);

我忘记了get() - 方法。 所以正确的方法必须是:

  $projects = Project::with(['tasks' => function($query) { $query->where('created_at', '>', Carbon::now()->subDays(30)); }])->get();

关注Connor_VG