如何在Laravel 8中按产品代码汇总各最新日期的数值
Laravel 8 实现按产品分组取最新记录并求和
需求:对包含product_code、date、value字段的数据表,按product_code分组后筛选每组内date最新的记录,最终对这些记录的value字段求和(示例结果为60)。
方法一:查询构造器(Query Builder)实现
通过子查询先获取每个产品的最新日期,再关联原表筛选对应记录并求和:
$totalSum = DB::table('your_table_name as t1') ->join( DB::raw('(SELECT product_code, MAX(date) as max_date FROM your_table_name GROUP BY product_code) as t2'), function ($join) { $join->on('t1.product_code', '=', 't2.product_code') ->on('t1.date', '=', 't2.max_date'); } ) ->sum('t1.value');
- 替换
your_table_name为你的实际数据表名 - 该逻辑先通过分组查询得到每个
product_code对应的最新日期,再通过关联匹配出对应记录,最后直接求和,性能高效且逻辑清晰。
方法二:Eloquent模型实现(若有对应模型)
假设你的模型为ProductRecord(对应数据表product_records),可以用joinSub方法实现:
use App\Models\ProductRecord; $totalSum = ProductRecord::query() ->joinSub( ProductRecord::select('product_code', DB::raw('MAX(date) as max_date')) ->groupBy('product_code'), 'latest_dates', function ($join) { $join->on('product_records.product_code', '=', 'latest_dates.product_code') ->on('product_records.date', '=', 'latest_dates.max_date'); } ) ->sum('product_records.value');
结果验证
上述两种方法最终都会返回示例中的求和结果60,完全匹配需求。
内容的提问来源于stack exchange,提问作者arief
相关产品推荐
相关产品推荐

