Laravel中如何按日期与状态双字段分组员工技能历史数据?
按日期+状态分组展示技能历史记录
后端数据处理
直接在Eloquent查询后利用Laravel集合的groupBy方法做链式分组,先按日期分组,再按状态细分:
$skillHistories = SkillsHistory::with('skills') ->where('employees_id', $emp_id) ->orderBy('date') ->get() ->groupBy(['date', 'status']);
这里用集合分组而非数据库GROUP BY,是因为我们需要保留每条技能记录的完整信息,而非做聚合统计。
前端Blade模板渲染
通过三层嵌套循环实现分组展示,同时维护全局连续序号:
@php $serialNumber = 1; @endphp @foreach ($skillHistories as $date => $statusGroups) <!-- 日期分组标题行 --> <tr> <td colspan="4" class="bg-light fw-semibold p-2">{{ \Carbon\Carbon::parse($date)->format('Y-m-d') }}</td> </tr> @foreach ($statusGroups as $status => $skillRecords) <!-- 状态分类行 --> <tr> <td colspan="4" class="text-muted p-1"> {{ $status == 1 ? '已添加技能' : '已移除技能' }} </td> </tr> <!-- 单个技能记录行 --> @foreach ($skillRecords as $skillHis) <tr> <td>{{ $serialNumber++ }}</td> <td> <span class="badge rounded-pill bg-primary m-l-15">{{ $skillHis->skills->skill_name}}</span> </td> <td>{{ $skillHis->date }}</td> <td> <span class="badge rounded-pill {{ $status == 1 ? 'bg-success' : 'bg-danger' }}"> {{ $status == 1 ? 'Added' : 'Removed' }} </span> </td> </tr> @endforeach @endforeach @endforeach
补充说明
- 用
$serialNumber变量替代原$loop->index,确保序号跨分组连续不重置 - 日期标题行通过
colspan="4"跨列,强化分组视觉效果 - 若你的
date字段已配置为Carbon实例,可直接用$date->format('Y-m-d'),无需parse转换
内容的提问来源于stack exchange,提问作者Wakil Ahmed
相关产品推荐
相关产品推荐

