You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

补充说明

  1. 用$serialNumber变量替代原$loop->index,确保序号跨分组连续不重置
  2. 日期标题行通过colspan="4"跨列,强化分组视觉效果
  3. 若你的date字段已配置为Carbon实例,可直接用$date->format('Y-m-d'),无需parse转换

内容的提问来源于stack exchange,提问作者Wakil Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:31:18