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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:24:47