Laravel Eloquent关联表查询:统计各分类商品数并显示无商品分类
解决左连接后无商品分类不显示的问题
你遇到的这个问题其实很典型——当你用LEFT JOIN关联两张表后,直接在WHERE子句里过滤关联表的字段,会把那些没有匹配到关联数据(也就是无商品的分类)给过滤掉,因为这些分类对应的product.status是NULL,根本满足不了=1的条件。
给你两种靠谱的解决思路,挑你顺手的用就行:
方法一:把商品状态过滤移到关联条件里
这种方式会在关联商品的时候就筛选出状态为1的商品,不会影响原本的分类结果,哪怕某个分类没有符合条件的商品,依然会被完整保留下来。
修正后的代码如下(还帮你改了拼写错误:categpry_id应该是category_id):
DB::table('categories') ->leftJoin('product', function($join) { $join->on('categories.id', '=', 'product.category_id') ->where('product.status', 1); // 把状态条件放到join的关联逻辑里 }) ->selectRaw('categories.*, count(product.id) as Count') ->groupBy('categories.id') ->get();
方法二:用WHERE结合OR包含无商品分类
如果你更习惯用WHERE子句,可以通过判断product.status要么是1,要么是NULL(也就是该分类没有关联商品)来保留所有分类:
DB::table('categories') ->leftJoin('product', 'categories.id', '=', 'product.category_id') ->selectRaw('categories.*, count(product.id) as Count') ->where(function($query) { $query->where('product.status', 1) ->orWhereNull('product.id'); // 兜底包含没有商品的分类 }) ->groupBy('categories.id') ->get();
小提示:
第一种方法效率更高,因为它在关联阶段就过滤了不必要的商品数据,减少了后续分组统计的数据量,更推荐用这个~
内容的提问来源于stack exchange,提问作者Wassim Hattab
相关产品推荐
相关产品推荐

