Lov*_*ess 3 php laravel eloquent
我正在使用Laravel 4并有两个模型:项目和任务.我的Project.php是
class Project extends \Eloquent {
protected $guarded = [];
public function tasks()
{
return $this->hasMany('Task');
}
}
Run Code Online (Sandbox Code Playgroud)
我的Task.php是
class Task extends \Eloquent {
protected $guarded = [];
public function project()
{
return $this->belongsTo('Project');
}
}
Run Code Online (Sandbox Code Playgroud)
直到现在相当标准的东西.
现在我想显示最近30天.我正在使用nesbot/Carbon,我可以这样做:
$projects = Project::with('tasks')->where('created_at', '>', Carbon::now()->subDays(30))->get();
Run Code Online (Sandbox Code Playgroud)
但这显示了过去30天的项目,但我想显示过去30天的任务.在Laravel.io聊天中,我得到了使用此建议:
$projects = Project::with(['tasks' => function($query) { $query->where('created_at', '>', Carbon::now()->subDays(30)); }]);
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.
我会很感激有关如何在过去30天内访问任务的建议,同时使用我通常在我的控制器中执行的模型关系.
爱,
乔治 :)
您需要使用whereHas约束来转移到主Project查询.
$constraint = function($query) {
$query->where('created_at', '>', Carbon::now()->subDays(30));
};
Project::with(['tasks' => $constraint])
->whereHas(['tasks' => $constraint])
->get();
Run Code Online (Sandbox Code Playgroud)
请注意,如果要显示所有项目的任务,可以删除with().
这有点低效,可以通过使用连接而不是whereHas来改进,但应该让你开始.