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
相关产品推荐
相关产品推荐

