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

Laravel中如何统计用户关联的所有Rating总数?

实现用户关联Rating总数的几种简洁方式

嘿,针对你的Laravel模型关联需求(User 一对多 Profile,Profile 一对多 Rating),想要实现类似$user->profiles()->ratings()->count()的调用,其实有几个很实用的方案,帮你把调用变得直观简洁:

方法一:用Has Many Through定义远层关联

Laravel的hasManyThrough关联就是专门用来处理这种跨两层的一对多关系的,直接在User模型里定义到Rating的关联:

// app/Models/User.php
public function ratings()
{
    // 参数依次是:目标模型,中间模型,中间模型的外键,目标模型的外键
    return $this->hasManyThrough(Rating::class, Profile::class, 'user_id', 'profile_id');
}

定义好之后,你就能直接用最接近你期望的方式调用了:

// 获取该用户所有Rating的总数
$total = $user->ratings()->count();

// 如果已经加载了关联数据,也可以用集合的count方法
$total = $user->ratings->count();

这种方式是最优雅的,Laravel会自动帮你生成正确的关联查询,性能也不错。

方法二:用withCount嵌套统计

如果你不想新增远层关联,也可以通过withCount嵌套统计每个Profile的Rating数量,再求和:

// 查询用户时,嵌套统计每个profile的ratings数量
$user = User::withCount(['profiles' => function ($query) {
    $query->withCount('ratings');
}])->find($yourUserId);

// 把所有profile的ratings_count加起来
$totalRatings = $user->profiles->sum('ratings_count');

不过这种方式需要手动求和,适合不需要频繁调用的场景。

方法三:自定义模型方法封装逻辑

在User模型里写一个自定义方法,把统计逻辑封装起来,调用更直观:

// app/Models/User.php
public function getTotalRatingsAttribute()
{
    // 更高效的查询方式:直接通过Rating模型关联查询
    return Rating::whereHas('profile', function ($query) {
        $query->where('user_id', $this->id);
    })->count();
}

这样你就能像访问模型属性一样调用:

$total = $user->total_ratings;

或者如果想写成方法形式:

public function totalRatings()
{
    return $this->getTotalRatingsAttribute();
}
// 调用:$user->totalRatings();

这种方式灵活性最高,适合需要添加额外过滤逻辑的场景。


内容的提问来源于stack exchange,提问作者Markus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:46:15