使用Laravel Eloquent的where子句查询时如何返回统计值为0的记录
问题原因
你在查询中增加了全局的where('claimed', '0')过滤条件,会在分组执行前就把所有已领取的宝藏记录全部剔除。如果某个点位的宝藏已经被全部领完,该点位没有任何符合过滤条件的记录进入分组阶段,自然不会出现在返回结果中。
解决方法
将未领取的筛选逻辑放到聚合函数内做条件计数,保留所有点位的记录参与分组,全领完的点位计数结果会自动返回0:
$treasure_hunt_data = TreasureHunt::selectRaw("treasure_name, SUM(claimed = 0) as total_left, cap") ->groupBy(['treasure_name', 'cap']) ->get();
如果你的数据库不支持直接在SUM里写判断条件,可以换用标准的COUNT+IF写法,效果完全一致:
$treasure_hunt_data = TreasureHunt::selectRaw("treasure_name, COUNT(IF(claimed = 0, 1, NULL)) as total_left, cap") ->groupBy(['treasure_name', 'cap']) ->get();
说明
- 同一个
treasure_name对应的cap值是固定的,所以分组时同时对treasure_name、cap两个字段分组不会产生额外的冗余分组,和业务逻辑匹配 - 调整后返回的结果会自动包含所有存在记录的宝藏点位,剩余为0的点位
total_left字段会返回0,完全符合预期返回格式要求
内容的提问来源于stack exchange,提问作者N.Tec
相关产品推荐
相关产品推荐

