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

Laravel中WhereDoesntHave Eloquent查询未按预期工作问题

问题分析与修正方案

原代码逻辑完全偏离需求:whereDoesntHave('program', ...) 会筛选不存在满足条件的关联program的日程,你传入的闭包是匹配end_date为null的program,所以最终得到的是「无关联program」或「所有关联program都已结束(end_date不为null)」的日程,和你要的结果正好相反。

要实现「无关联program的日程,或关联至少一个未结束program的日程」,需要将条件改为「无关联program」或「存在至少一个未结束的关联program」,修正后的代码如下:

Schedule::where([
            'owner_id' => auth()->user()->owner->id,
            'session_id' => CurrentSession::fetchCurrentSession()->session_id
        ])
        ->where(function ($query) {
            // 无关联program的日程
            $query->whereDoesntHave('program')
                  // 或关联至少一个未结束program的日程
                  ->orWhereHas('program', function(Builder $query){
                      $query->where('end_date', null);
                  });
        })
        ->orderBy('schedule_time', 'asc')
        ->get();

关键说明

  • whereDoesntHave('program'):直接筛选没有任何关联program的日程。
  • orWhereHas('program', ...):筛选存在至少一个end_date为null(未结束)的关联program的日程。
  • 外层where()包裹是为了让这两个条件和前面的owner_id、session_id条件同时生效,避免逻辑冲突。

内容的提问来源于stack exchange,提问作者BlackPearl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:44:55