Eloquent-从闭包内向主查询实例添加查询



在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());
});

最新更新