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
相关产品推荐
相关产品推荐

