Laravel中使用withCount做关联统计时如何添加draft=1的过滤条件
Laravel 中实现 withCount 仅统计符合条件的关联记录
你可以直接在withCount方法中传入带查询条件的闭包来筛选需要统计的关联记录,具体修改方案如下:
方案1:单次查询直接加筛选条件
直接对articles关联追加draft=1的筛选逻辑即可:
$categories = BlogCategory::withCount(['articles' => function ($query) { $query->where('draft', 1); }])->get();
查询完成后你依然可以通过每个分类对象的articles_count属性,获取到对应分类下draft值为1的文章数量。
方案2:封装独立关联实现复用
如果需要频繁统计分类下draft为1的文章数量,你可以直接在BlogCategory模型中定义一个独立的关联关系,后续直接调用即可:
- 先在
BlogCategory模型中新增关联方法:
// App\Models\BlogCategory.php public function draftArticles() { return $this->hasMany(Article::class)->where('draft', 1); }
- 调用时直接使用新关联做统计:
$categories = BlogCategory::withCount('draftArticles')->get();
这种方式获取到的统计值会保存在draft_articles_count属性中,无需每次写重复的筛选逻辑,复用性更高。
原理说明:Laravel的
withCount方法支持传入键为关联名、值为查询闭包的数组结构,闭包内可以对关联的查询追加任意筛选条件,最终统计的时候只会统计满足筛选条件的关联记录。
内容的提问来源于stack exchange,提问作者user16993770
相关产品推荐
相关产品推荐

