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

Eloquent:如何通过关联模型计算产品的平均评分

实现Product模型的averageScore方法

下面给你几种可行的实现方案,根据实际场景选择即可:

方案1:借助关联关系的聚合方法

首先确保你的Review模型已经定义好和Score的关联:

// Review.php
public function score()
{
    return $this->hasOne(Score::class, 'id', 'score_id');
}

然后在Product模型的averageScore方法中,通过reviews关联调用withAvg计算评分平均值:

public function averageScore()
{
    // 无评论/评分时返回0,可根据需求改为null
    return $this->reviews()->withAvg('score', 'value')->first()->score_avg_value ?? 0;
}

方案2:直接用JOIN查询提升性能

如果想避免加载多余的模型实例,直接通过数据库JOIN计算,性能会更优:

public function averageScore()
{
    return $this->reviews()
        ->join('scores', 'reviews.score_id', '=', 'scores.id')
        ->avg('scores.value') ?? 0;
}

方案3:批量查询时预加载平均值(避免N+1问题)

如果需要一次性获取多个产品的平均评分,别循环调用averageScore方法,推荐在查询Product时预加载平均值:

// 控制器中查询产品
$products = Product::withAvg('reviews.score', 'average_score')->get();

// 访问单个产品的平均评分
foreach ($products as $product) {
    $avgScore = $product->reviews_score_avg_average_score ?? 0;
}

这种方式能避免循环查询每个产品时产生的额外数据库请求,大幅提升批量查询的性能。

注意点

  • 当产品没有评论,或者评论未关联评分时,上述方法会返回null,用?? 0可以将其转为0,你可以根据业务需求调整这个默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:12:39