Laravel Eloquent:按barcode汇总对象数组的quantity值
Laravel Eloquent 按 barcode 汇总 quantity 解决方案
一、直接从数据库查询时汇总(推荐)
如果数据存储在数据库中,直接通过 Eloquent 分组+聚合查询处理,性能更优:
假设对应模型为 Product(可替换为你的实际模型名):
use Illuminate\Support\Facades\DB; $aggregated = Product::select( 'barcode', 'description', DB::raw('SUM(quantity) as qty'), DB::raw('MIN(id) as id') // 取每组最小的 id,匹配示例输出逻辑 ) ->groupBy('barcode', 'description') // 按条码和描述分组,确保同条码同描述的条目合并 ->get();
二、处理已获取的 Eloquent Collection
如果已经拿到了对象数组(Eloquent Collection),可以用集合方法在内存中处理:
// 假设 $items 是你的目标 Eloquent Collection $aggregated = $items->groupBy(['barcode', 'description']) ->map(function ($group) { return [ 'id' => $group->min('id'), 'barcode' => $group->first()->barcode, 'description' => $group->first()->description, 'qty' => $group->sum('quantity') ]; }) ->values() // 重置数组索引为连续数字 ->toArray(); // 转为纯数组,无需数组则可省略此方法
注意事项
- 示例中
quantity为字符串类型,Laravel 的聚合函数和集合方法会自动转换类型完成求和计算 - 示例期望输出中第二个条目的
description存在笔误(应为paper),上述代码会自动保留分组内正确的描述值
内容的提问来源于stack exchange,提问作者Edson
相关产品推荐
相关产品推荐

