You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何使用whereDoesntHave查询指定时间段无生产任务的用户

问题根因

你现有代码存在两个问题:

  1. 时间段冲突判断逻辑不完整:仅过滤了「完全落在目标生产任务时间范围内」的关联任务,漏掉了「部分重叠」「完全覆盖目标时间段」等所有其他冲突场景,导致过滤结果不符合预期
  2. 闭包未引入外部变量: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:39:03