Laravel中使用withCount与Case语句时字段不存在的解决方法
问题原因
你遇到的报错是因为Laravel查询构建器中,selectRaw()会替换之前已定义的select字段集合,而非追加。原代码的执行逻辑导致最终查询中不存在relation_1_count这类字段:
- 先执行
select('id'),此时查询字段仅包含id - 调用
withCount()会自动往select集合追加relation_1_count、relation_2_count、relation_3_count三个统计字段 - 最后调用
selectRaw()直接覆盖了所有之前的select字段,最终查询仅保留model_status,自然找不到统计字段
解决方法
将selectRaw()替换为addSelect(),它会在已有的select字段集合后追加新字段,保留withCount()生成的统计值:
use Illuminate\Support\Facades\DB; Model::query() ->select('id') ->withCount(['relation_1', 'relation_2', 'relation_3']) ->addSelect( DB::raw('(CASE WHEN relation_1_count < 0 THEN "relation 1 failed" WHEN relation_1_count > 0 and relation_2_count < 0 THEN "relation 2 failed" WHEN relation_1_count > 0 and relation_2_count > 0 and relation_3_count < 0 THEN "relation 3 failed" ELSE "All relations passed" END) AS model_status') ) ->get();
额外提示
withCount()统计的是关联模型的数量,结果必然是非负整数(≥0),你代码中判断<0的逻辑永远不会触发,建议根据实际需求调整为=0(表示无关联数据)或其他合理条件。
内容的提问来源于stack exchange,提问作者Suresh Hemal
相关产品推荐
相关产品推荐

