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

