Laravel中按相同penyedia_id计算平均分并展示到Penyedia表视图
问题原因
你当前代码存在两个问题:
$totalAvg查询返回的是所有penyedia_id对应平均评分的集合,循环输出Penyedia列表时没有按外键ID匹配对应评分,直接打印整个集合就会展示全部查询结果- 额外查询全量Pekerjaan表数据的逻辑属于冗余代码,全程没有被使用,会产生不必要的性能开销
实现方案
推荐方案:使用Eloquent关联聚合(性能最优、代码最简洁)
Laravel Eloquent原生提供了关联聚合方法withAvg,可以在查询主表数据时直接计算关联表的字段平均值,不需要额外写分组查询,也不需要冗余查全量关联表数据。
控制器代码修改
public function tabelnilai_penyedia(){ // 预加载关联Pekerjaan的nilai_total平均值,查询结果会自动为每个Penyedia模型追加pekerjaans_avg_nilai_total属性 $penyedia = Penyedia::withAvg('pekerjaans', 'nilai_total')->get(); return view('admin.datanilai_penyedia', compact('penyedia')); }
Blade模板修改
找到Nilai列的输出位置,直接调用自动生成的聚合属性即可,空值判断用于兼容没有关联Pekerjaan记录的Penyedia数据:
<td>{{ $penyedias->pekerjaans_avg_nilai_total ?? '暂无评分' }}</td>
兼容原有写法的修改方案
如果你要保留原有的分组查询逻辑,只需要把查询到的平均评分结果按penyedia_id做键映射,循环时按当前Penyedia的ID匹配对应值即可。
控制器代码修改
public function tabelnilai_penyedia(){ $penyedia = Penyedia::all(); $totalAvg = Pekerjaan::selectRaw("penyedia_id, AVG(nilai_total) AS avg") ->groupBy('penyedia_id') ->get() // 用keyBy将集合键设置为penyedia_id,方便后续直接按ID取值 ->keyBy('penyedia_id'); return view('admin.datanilai_penyedia', compact('penyedia', 'totalAvg')); }
Blade模板修改
<td>{{ $totalAvg->get($penyedias->id)?->avg ?? '暂无评分' }}</td>
补充说明
两种方案都可以实现每个Penyedia行对应展示自身关联Pekerjaan的nilai_total平均值,不会再出现输出整个查询集合的问题。优先使用第一种关联聚合方案,代码更简洁,查询性能更高,避免冗余数据查询。
内容的提问来源于stack exchange,提问作者YuPi
相关产品推荐
相关产品推荐

