在Laravel 8中,我试图在闭包中的主查询上执行一个额外的where子句,以防该记录的关系不存在(而不是在不存在的关系上执行额外的where语句(。
示例表结构:
Tasks:
task_id
task_name
first_review_due
Actions:
action_id
action_performed
next_review_due
task_id
代码:
/**
* Scope a query to only include overdue tasks.
*
* @param IlluminateDatabaseEloquentBuilder $query
* @return IlluminateDatabaseEloquentBuilder
*/
public function scopeOverdue($query)
{
return $query->whereHas('Action', function ($query) {
$query->latest()->where('next_review_due','<', Carbon::today());
})->orWhereDoesntHave('Action', function($query) {
$query->where('first_review_due','<',Carbon::today());
});
}
我试图执行的查询应该使用";next_ review_;根据操作表中的最新结果(如果存在关系的实例(。如果该关系不存在,则应该使用"来运行查询;first_ review_;在主桌上。我当前的代码已包含在上面。
如果Action关系不存在(而不是在Action表中查找first_review_due(,如何修改此范围以仅查询当前模型中的first_review_due列?
如果您创建latestAction关系会更容易:
public function latestAction() {
return $this->hasOne(Action::class)->latest();
}
然后,在查询部分,您可以直接访问latestAction:
$query
->whereHas('latestAction', function($latestAction) {
return $latestAction->where('next_review_due','<', Carbon::today());
})
->orWhere(function($q) {
return $q->doesntHave('latestAction')
->where('first_review_due','<',Carbon::today());
});