Laravel按供应商ID计算工作总分均值并存入供应商表方案
报错根因
你遇到的参数数量不足报错,核心原因是给列表加载方法tabelnilai_penyedia()新增了必填的$id入参,但绑定的路由规则里没有配置同名路由参数,Laravel无法自动解析传值,就会抛出参数缺失错误。
本质是设计逻辑偏差:供应商列表页是加载全量/分页供应商数据,不需要接收单个供应商ID作为入参,把单供应商均值计算逻辑绑定到带ID参数的列表方法上,本身就不符合列表接口的设计逻辑。
正确实现方案
1. 配置模型关联
先在供应商模型Penyedia中定义和工作表Pekerjaan的一对多关联,后续统计直接用Eloquent关联方法,避免手写SQL出错:
// app/Models/Penyedia.php /** * 关联供应商名下所有工作记录 * 外键字段根据你实际表结构调整,默认规则是表名_id即penyedia_id */ public function pekerjaans() { return $this->hasMany(Pekerjaan::class, 'penyedia_id', 'id'); }
2. 封装均值更新逻辑
把单供应商的均值计算、入库逻辑抽成独立可复用的方法,不要写在列表加载方法里:
// 可以放在AdminController中作为私有方法,也可以封装到Penyedia模型中 private function hitungRataRataNilai(Penyedia $penyedia) { // 统计该供应商下所有工作记录的nilai_total平均值,无工作记录时默认记0 $nilaiRataRata = $penyedia->pekerjaans()->avg('nilai_total') ?? 0; // 计算结果写入供应商表对应字段,字段名替换为你表中实际存储平均分值的字段名 $penyedia->update([ 'nilai_rata_rata' => round($nilaiRataRata, 2) // 保留小数位数按需调整 ]); return $nilaiRataRata; }
在你已经实现的工作评分更新方法update_nilaipekerjaan的末尾,拿到当前工作记录关联的供应商ID,调用上述方法即时重算对应供应商的平均分值,保证数据实时一致,不需要等访问列表页才更新:
// 在update_nilaipekerjaan方法更新完单条pekerjaan的nilai_total后加 $penyedia = Penyedia::find($pekerjaan->penyedia_id); $this->hitungRataRataNilai($penyedia);
3. 修正列表加载方法
移除tabelnilai_penyedia方法上的$id参数,恢复方法无参的结构,直接查询供应商数据传给视图即可:
public function tabelnilai_penyedia() { // 首次上线如果有历史数据未计算均值,可以放开下面的注释批量计算一次,跑完后注释掉避免每次访问列表全表计算 // Penyedia::chunk(100, function($daftarPenyedia) { // foreach($daftarPenyedia as $p) { // $this->hitungRataRataNilai($p); // } // }); // 查询供应商列表,按需添加分页、筛选条件 $daftarPenyedia = Penyedia::paginate(10); return view('路径对应你的供应商列表Blade模板', compact('daftarPenyedia')); }
4. 修正路由配置
确保绑定到tabelnilai_penyedia方法的路由没有多余参数,常规GET路由即可:
// routes/web.php 路由配置示例 Route::get('/admin/penyedia/nilai', [AdminController::class, 'tabelnilai_penyedia'])->name('admin.penyedia.nilai');
5. 视图展示
你已经在Blade模板中预留了平均分值列,直接在对应位置输出字段值即可:
{{-- 表格对应列 --}} <td>{{ $item->nilai_rata_rata ?? 0 }}</td>
优化提示:不要把均值计算逻辑全量放在列表访问时执行,单条工作记录更新后即时重算对应供应商的分值,性能更高,也不会出现路由参数不匹配的问题。
内容的提问来源于stack exchange,提问作者YuPi
相关产品推荐
相关产品推荐

