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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:16:31