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

Laravel中如何在预加载关联关系时获取评分平均值

解决方案

你的问题出在错误地将聚合查询和关联预加载逻辑混用了——hasMany返回的是关联模型集合,而avg()是返回单个值的聚合函数,没法通过这种方式实现预加载。下面是两种可行的实现方式:

方法一:使用Laravel自带的withAvg(推荐)

Laravel提供了专门的聚合预加载方法withAvg,直接基于已有的feedbacks关联即可实现:

// 获取数据时预加载平均评分
$userTalks = UserTalk::withAvg('feedbacks', 'rating')->get();

之后可以通过以下方式访问每个UserTalk的平均评分:

// 默认属性名格式为「关联名_avg_字段名」
echo $userTalk->feedbacks_avg_rating;

如果需要自定义属性名,可添加别名:

$userTalks = UserTalk::withAvg('feedbacks as average_rating', 'rating')->get();

// 通过自定义属性名访问
echo $userTalk->average_rating;

方法二:手动关联聚合查询(适合复杂场景)

如果需要更灵活的查询逻辑,可以通过selectRaw结合关联查询实现:

$userTalks = UserTalk::select('user_talk.*')
    ->leftJoin('user_talk_feedback', 'user_talk.id', '=', 'user_talk_feedback.user_talk_id')
    ->groupBy('user_talk.id')
    ->selectRaw('AVG(user_talk_feedback.rating) as average_rating')
    ->get();

这种方式会在一次查询中完成主表数据和聚合计算,适合不需要单独加载feedbacks集合的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:15:04