Laravel聚合求和仅分页生效:如何实现全筛选数据总和
解决Laravel分页下筛选数据的总金额求和问题
我来帮你搞定这个问题——你现在遇到的是分页集合的sum()方法只计算当前页数据的问题,要获取所有符合筛选条件的金额总和,我们可以在控制器里单独基于同一个查询逻辑计算总金额,再传递到视图中展示。
步骤1:修改控制器代码
首先我们把查询逻辑抽出来复用,先计算总金额再执行分页,这样能保证筛选条件完全一致:
public function salesReport(Request $request) { // 1. 构建基础查询构造器 $query = DB::table('sales') ->select('cust_code', 'trans_id', DB::raw('created_at as created_date'), 'amount') ->orderBy('created_at', 'DESC'); $render = []; // 2. 处理日期筛选条件(修正原代码中未定义$start_date/$end_date的小问题) if (isset($request->start_date) && isset($request->end_date)) { $start_date = $request->start_date; $end_date = $request->end_date; $query->whereBetween('created_at', [$start_date . ' 00:00:00', $end_date . ' 23:59:59']); $render['start_date'] = $start_date; $render['end_date'] = $end_date; } elseif (isset($request->start_date)) { $query->where('created_at', $request->start_date); $render['start_date'] = $request->start_date; } // 3. 计算所有符合筛选条件的金额总和(直接通过数据库查询,效率更高) $totalAmount = $query->sum('amount'); // 4. 执行分页并携带筛选参数 $billings = $query->paginate(15)->appends($render); // 5. 将分页数据和总金额一起传递到视图 $data['billings'] = $billings; $data['totalAmount'] = $totalAmount; return view('report.bbnaijaonetimebillingsReport', $data); }
步骤2:修改视图代码
把原来的求和代码替换成我们传递过来的$totalAmount即可:
<!-- 原来的求和代码 --> <!-- {{ $billings->sum('amount') }} --> <!-- 修改后的代码 --> {{ $totalAmount }}
为什么原来的方法不行?
paginate()返回的是LengthAwarePaginator实例,它的sum()方法只会对当前页加载到内存中的集合数据求和,而不是针对整个数据库查询结果。我们通过查询构造器的sum()方法直接在数据库层面计算总和,不仅结果准确,还避免了把所有数据拉到内存的性能损耗。
内容的提问来源于stack exchange,提问作者user11352561
相关产品推荐
相关产品推荐

