Laravel如何从数据库获取结构化数据实现产奶量统计图表
Laravel框架下奶牛场收奶量统计查询实现
基于需求,两类统计逻辑的实现代码如下,默认收奶记录对应模型为MilkCollection,核心字段包含collection_date(收奶日期,datetime/timestamp类型)、animal_id(动物唯一编号)、milk_yield(单次收奶重量,浮点型)。
一、指定周期内按日期维度统计总收奶量
该接口返回结果可直接对接日期维度的折线图、柱状图组件:
// 可根据前端传参动态调整统计周期,示例为最近30天 $startDate = now()->subDays(30)->startOfDay(); $endDate = now()->endOfDay(); // 基础分组查询 $dailyStat = MilkCollection::query() ->whereBetween('collection_date', [$startDate, $endDate]) ->selectRaw('DATE(collection_date) as stat_date, SUM(milk_yield) as total_milk') ->groupBy('stat_date') ->orderBy('stat_date', 'asc') ->get();
如果需要补全统计周期内无收奶记录的日期(避免图表横轴出现日期断层),可以加一段补零逻辑:
$dateRange = \Carbon\CarbonPeriod::create($startDate, $endDate); $fullDailyData = collect($dateRange)->map(function ($dayItem) use ($dailyStat) { $currentDate = $dayItem->toDateString(); $matched = $dailyStat->firstWhere('stat_date', $currentDate); return [ 'stat_date' => $currentDate, 'total_milk' => $matched ? $matched->total_milk : 0 ]; });
返回数据格式示例:
[ {"stat_date":"2024-05-01","total_milk":1247.8}, {"stat_date":"2024-05-02","total_milk":1302.4} ]
二、指定周期内按动物维度统计总收奶量
该接口返回结果可对接动物维度的排行柱状图、明细表格:
$animalStat = MilkCollection::query() ->whereBetween('collection_date', [$startDate, $endDate]) ->selectRaw('animal_id, SUM(milk_yield) as total_milk, COUNT(id) as record_count') // 若需要关联动物基础信息表获取牛号、品种、栏位等信息,放开以下注释即可 // ->leftJoin('animals', 'animals.id', '=', 'milk_collections.animal_id') // ->addSelect('animals.animal_no', 'animals.breed', 'animals.pen_id') ->groupBy('animal_id') ->orderBy('total_milk', 'desc') ->get();
返回数据格式示例:
[ {"animal_id":107,"total_milk":492.5,"record_count":60}, {"animal_id":98,"total_milk":468.2,"record_count":60} ]
注意事项:
- 若
collection_date是带时分秒的时间类型,分组时必须用DATE()函数截取日期部分,否则会按精确时间点分组导致统计错误- 数据量较大时,可以给
collection_date、animal_id字段加联合索引,提升查询速度
内容的提问来源于stack exchange,提问作者Rahul W
相关产品推荐
相关产品推荐

