Laravel中按user_id分组求和并仅展示当前用户数据的方法
问题描述
在Laravel项目中对savings表的paid字段求和时,当前实现了全用户分组求和,但需求是:登录用户访问页面时,仅展示该用户对应的paid求和结果,而非所有用户的数据。
现有代码问题
当前控制器中的分组求和查询未添加登录用户的过滤条件,导致返回所有用户的求和结果:
$saving = Saving::groupBy('user_id') ->selectRaw('sum(paid) as sum, user_id') ->pluck('sum','user_id');
调试输出显示包含了user_id=1和2的求和结果,不符合需求。
解决方案
1. 过滤当前登录用户的求和查询
给求和查询添加where条件,限定为当前登录用户的user_id;同时因为只需要单个用户的总和,无需分组(分组是多用户聚合场景的需求),可以简化查询逻辑:
修正后的控制器代码:
public function index() { $students = Student::all(); $currentUserId = auth()->id(); // 获取当前用户的所有储蓄记录 $savings = Saving::where('user_id', $currentUserId)->get(); // 直接计算当前用户的paid总和 $totalPaid = Saving::where('user_id', $currentUserId)->sum('paid'); return view('pages.dashboard.siswa.saving.index', compact('students', 'savings', 'totalPaid')); }
2. 修正视图中的求和展示
原视图中$saving->sum('paid')是对单条储蓄记录求和,逻辑错误,应改为使用控制器传递的$totalPaid变量:
修正后的Blade视图关键代码:
@foreach ($savings as $saving) <tr> <td>{{ $saving->student->name }}</td> <td>Rp. {{ number_format($saving->paid, 2) }}</td> <!-- 展示当前用户的总求和 --> <td>Rp. {{ number_format($totalPaid, 2) }}</td> <td> <div class="table-data-feature"> <a href="{{ route('dashboard.saving.edit', $saving->id) }}"> <button class="item" data-toggle="tooltip" data-placement="top" title="Edit"> <i class="zmdi zmdi-edit"></i> </button> </a> <form class="inline" action="{{ route('dashboard.saving.destroy', $saving->id) }}" method="POST"> @csrf @method('delete') <button class="item" data-toggle="tooltip" data-placement="top" title="Delete"> <i class="zmdi zmdi-delete"></i> </button> </form> </div> </td> </tr> <tr class="spacer"></tr> @endforeach
额外优化建议
数据库中paid字段定义为string类型,求和时会自动转换,但建议改为decimal类型更符合金额存储规范:
$table->decimal('paid', 10, 2);
内容的提问来源于stack exchange,提问作者Fikri Ashshidiq
相关产品推荐
相关产品推荐

