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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:27:25