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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:45:49