Laravel中如何使用loadCount统计多层关联模型数量?
解决Laravel嵌套关联计数的问题
首先确保你的Factory模型已经正确定义了与Category的关联:
class Factory extends Model { use HasFactory; public function categories() { return $this->hasMany(Category::class); } }
正确的关联计数写法
你之前使用loadCount('categories.products')报错,是因为loadCount不支持直接用点语法指定嵌套关联。要给每个分类统计产品数量,有两种常用写法:
方法1:查询时直接嵌套统计
在查询Factory的同时,给关联的categories加上产品计数:
$factories = Factory::with(['categories' => function ($query) { $query->withCount('products'); }])->get(); // PHP 7.4+ 可用短闭包简化: $factories = Factory::with(['categories' => fn($q) => $q->withCount('products')])->get();
方法2:已获取集合后追加统计
如果已经拿到了$factories集合,再通过load方法追加分类的产品计数:
$factories = Factory::get(); $factories->load(['categories' => fn($q) => $q->withCount('products')]);
获取产品数量
完成上述操作后,每个Category实例会自动生成一个products_count属性,直接访问即可获取对应分类的产品数量:
// 遍历输出示例 foreach ($factories as $factory) { echo "工厂名称:{$factory->name}\n"; foreach ($factory->categories as $category) { echo "分类名称:{$category->name},产品数量:{$category->products_count}\n"; } }
可选:封装查询作用域(优化代码复用)
如果需要多次使用这个统计逻辑,可以在Category模型里定义一个查询作用域:
// Category模型 public function scopeWithProductCount($query) { return $query->withCount('products'); }
之后使用时就可以简化成:
$factories = Factory::with(['categories' => fn($q) => $q->withProductCount()])->get();
内容的提问来源于stack exchange,提问作者inf3rno
相关产品推荐
相关产品推荐

