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

Laravel中whereNotNull()使用异常:未正确筛选含比分的赛事数据

问题解决:NFL赛事竞猜应用中球队已完成赛事查询错误

核心问题:查询逻辑的优先级错误

你的原查询出现问题是因为SQL中AND的优先级高于OR,导致最终生成的SQL语句逻辑和预期不符:
原代码生成的SQL等价于:

SELECT * FROM games 
WHERE homescore IS NOT NULL 
AND awayscore IS NOT NULL 
AND home = 'PIT' 
OR away = 'PIT';

这会把所有away = 'PIT'的记录都包含进来,不管比分是否为空,这就是结果里出现无比分PIT客场赛事的原因。

正确的查询写法

需要把球队参与的条件用闭包包裹,让它作为一个整体和比分非空的条件进行AND判断:

$games = Game::whereNotNull('homescore')
    ->whereNotNull('awayscore')
    ->where(function ($query) {
        $query->where('home', 'PIT')
              ->orWhere('away', 'PIT');
    })
    ->get();

这段代码生成的SQL是:

SELECT * FROM games 
WHERE homescore IS NOT NULL 
AND awayscore IS NOT NULL 
AND (home = 'PIT' OR away = 'PIT');

这样就能精准筛选出PIT参与且比分已录入的赛事。

关于集合筛选异常的补充

你提到先获取所有17条PIT参与的赛事,再用集合筛选仍得到10条(预期4条),可能的原因:

  • 检查集合筛选的代码是否正确,必须连续调用两个whereNotNull:
    $allPitGames = Game::where('home', 'PIT')->orWhere('away', 'PIT')->get();
    $completedGames = $allPitGames->whereNotNull('homescore')->whereNotNull('awayscore');
    
  • 确认数据库中实际存在的比分非空的PIT赛事数量是否确实为4条,可以直接在数据库执行SQL验证:
    SELECT COUNT(*) FROM games 
    WHERE homescore IS NOT NULL 
    AND awayscore IS NOT NULL 
    AND (home = 'PIT' OR away = 'PIT');
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:54