我有两个模型:Project和Task。
在他们的模型中,两者都有相互关系。
任务的进度状态为in_progress(1(或completed(0(。
使用关系,我试图只得到那些只完成了任务的项目。
现在,使用我的代码,我得到的项目至少完成了一项任务。
谢谢你的帮助!
public function completedtasks()
{
return $this->hasmany(Task::class)->whereStatus_id(1)->whereProgress_id(0);
}
我认为你应该用不同的方式来处理这个问题:
在您的项目中创建您的关系方法:
/**
* @return HasMany
*/
public function tasks(): HasMany
{
return $this->hasMany(Task::class);
}
然后你可以这样过滤你的项目:
$projects = Project::whereHas('tasks', function($query) {
return $query->where('progress_id', 1);
})->get();
您可以使用progress_id = 0
获得所有没有任何任务的项目。然后,您还可以检查项目是否有任何带有progress_id = 1
(已完成(的任务。[项目不能有任何带有progess_id = 0
的任务,并且必须至少有一个带有progress_id = 1
的任务]
Project::whereDoesntHave('tasks', function ($query) {
$query->where('progress_id', 0);
})->whereHas('tasks', function ($query) {
$query->where('progress_id', 1);
})->get();
Laravel 6.x Docs-Eloquent Relationships-查询关系缺失-whereDoesntHave
Laravel 6.x文档-显式关系-查询关系存在-whereHas