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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:06:01