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

Laravel控制器添加whereDate查询后无法获取数据求助

问题原因:逻辑运算符优先级导致查询逻辑偏离预期

你添加whereDate后查不到数据,核心问题是SQL逻辑运算符的优先级规则——AND的优先级高于OR,导致实际执行的查询逻辑和你预想的完全不一样。

原代码添加whereDate后,生成的SQL大致结构是:

WHERE 
    EXISTS (...) -- whereHas对应的关联查询条件
    AND school_id = ? 
    OR school_id IS NULL 
    AND DATE(deadline_viewing) >= NOW()

由于AND优先级更高,这段SQL会被数据库解析成:

WHERE 
    EXISTS (...) 
    AND (school_id = ? AND DATE(deadline_viewing) >= NOW())
    OR (school_id IS NULL AND DATE(deadline_viewing) >= NOW())

这和你期望的「(school_id匹配指定值 或 school_id为空) 并且 deadline_viewing未过期」逻辑完全不符,自然查不到符合条件的数据。

修正方案

把school_id的两个条件用闭包包裹,让它们作为一个逻辑整体,再和whereDate、whereHas形成AND关系:

public function getPublicPost($school_id){
    $public_feeds = app(AllyFeedRepository::class)->query()
        ->whereHas('user_detail', function($q){
            $q->whereNull('deleted_at');
        })
        ->with('user_detail:id,name,profile_photo_path,deleted_at','userInstance:id,user_id,role_id','userInstance.role:id,name','announcement:id,description,file_path,type,deleted_at')
        ->where(function($query) use ($school_id) {
            $query->whereSchoolId($school_id)
                  ->orWhere('school_id', null);
        })
        ->whereDate('deadline_viewing', '>=', now())
        ->orderBy('created_at','DESC')
        ->paginate(15);
    return $public_feeds;
}

修正后生成的SQL逻辑就完全符合预期了:

WHERE 
    EXISTS (...)
    AND (school_id = ? OR school_id IS NULL)
    AND DATE(deadline_viewing) >= NOW()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:01:16