Laravel关联查询:如何统计分组后的关联数据数量
解决Laravel中关联表分组统计数量的问题
针对你需要统计关联表views按view_id分组后的数量(而非总条数或分组后的数组),可以用以下几种方法实现:
方法一:使用withCount结合DISTINCT直接统计
直接在withCount里通过子查询统计每个post对应的不同view_id数量,给统计结果起别名方便调用:
use Illuminate\Support\Facades\DB; $query = Post::withCount([ 'related_views as unique_view_count' => function ($query) { $query->select(DB::raw('COUNT(DISTINCT view_id)')); } ])->get();
查询后每个Post实例会新增unique_view_count属性,对应分组后的数量(比如示例中post1的这个值是2,post2是1)。
方法二:通过join+groupBy实现
如果需要同时查询其他关联字段,也可以用表连接的方式,直接在主查询里统计:
use Illuminate\Support\Facades\DB; $query = Post::select('post.*', DB::raw('COUNT(DISTINCT views.view_id) as unique_view_count')) ->leftJoin('views', 'post.id', '=', 'views.post_id') ->groupBy('post.id') ->get();
这种方式会直接把统计字段和post表字段一起查询出来,适合不需要加载完整关联数据的场景。
方法三:自定义分组关联再统计
在Post模型里定义一个已经按view_id分组的关联,然后对这个关联做withCount:
// Post模型中新增关联 public function unique_views() { return $this->hasMany(Views::class, 'post_id', 'id') ->select('post_id', 'view_id') ->groupBy('post_id', 'view_id'); } // 查询时 $query = Post::withCount('unique_views')->get();
此时Post实例的unique_views_count属性就是分组后的数量,因为unique_views关联本身返回的是每个view_id的分组结果,count这个关联的结果数就是分组的数目。
内容的提问来源于stack exchange,提问作者Danilo
相关产品推荐
相关产品推荐

