Laravel中如何使用whereDoesntHave查询指定时间段无生产任务的用户
问题根因
你现有代码存在两个问题:
- 时间段冲突判断逻辑不完整:仅过滤了「完全落在目标生产任务时间范围内」的关联任务,漏掉了「部分重叠」「完全覆盖目标时间段」等所有其他冲突场景,导致过滤结果不符合预期
- 闭包未引入外部变量:
whereDoesntHave的查询闭包没有用use引入$production变量,运行时会抛出变量未定义的错误
正确逻辑说明
判断两个时间段是否有重叠的通用规则是:已有任务的开始时间 < 目标任务的结束时间 且 已有任务的结束时间 > 目标任务的开始时间
只要满足以上条件,就说明两个任务时间存在冲突,需要排除对应用户。
修正后代码
$production = Production::findOrFail($id); $availableUsers = User::whereDoesntHave('productions', function ($query) use ($production) { // 筛选所有和当前生产任务时间段存在重叠的生产任务 $query->where('start_at', '<', $production->end_at) ->where('end_at', '>', $production->start_at); })->get(); // 原关联定义无需修改 public function productions() { return $this->belongsToMany(Production::class) ->withPivot(['created_at', 'updated_at']); }
内容的提问来源于stack exchange,提问作者Theodory
相关产品推荐
相关产品推荐

