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

Laravel8如何按阶段分组展示用户各阶段进度状态数据

Laravel 8 实现用户阶段状态交叉表展示方案

1. 控制器数据预处理

你当前仅查询全量数据的情况下,先对数据做结构化整理,避免视图层嵌套复杂逻辑,代码示例如下:

// 替换为你自己的对应模型类名,获取全量数据
$allRecords = \App\Models\YourModel::all();

// 提取所有不重复的阶段值,作为表格的列标题
$phaseList = $allRecords->pluck('phase')->unique()->sort()->values();

// 按用户分组,整理每个用户对应各阶段的状态
$userStatusData = $allRecords->groupBy('user')->map(function ($userRecords) use ($phaseList) {
    // 先初始化所有阶段状态为默认值,避免部分用户缺失阶段时表格列错位
    $statusMap = $phaseList->mapWithKeys(fn($phase) => [$phase => null]);
    // 填充该用户已有的阶段状态
    foreach ($userRecords as $record) {
        $statusMap[$record->phase] = $record->status;
    }
    return $statusMap;
});

// 将处理后的数据传递到视图
return view('your.blade.path', compact('phaseList', 'userStatusData'));

2. Blade视图渲染代码

直接使用HTML表格渲染交叉表即可,代码示例如下:

<table style="border-collapse: collapse; width: 100%;">
    <thead>
        <tr style="background: #f5f5f5;">
            <th style="border: 1px solid #ddd; padding: 8px;">用户标识</th>
            <!-- 遍历所有阶段作为表头列 -->
            @foreach($phaseList as $phase)
                <th style="border: 1px solid #ddd; padding: 8px;">{{ $phase }}</th>
            @endforeach
        </tr>
    </thead>
    <tbody>
        <!-- 遍历每个用户的阶段状态数据 -->
        @foreach($userStatusData as $user => $statusMap)
            <tr>
                <td style="border: 1px solid #ddd; padding: 8px;">{{ $user }}</td>
                <!-- 遍历该用户所有阶段的状态 -->
                @foreach($statusMap as $status)
                    <td style="border: 1px solid #ddd; padding: 8px;">
                        <!-- 可根据业务需求自定义状态展示样式 -->
                        {{ $status ?? '未录入' }}
                        <!-- 状态样式扩展示例:
                        @switch($status)
                            @case('已完成')
                                <span class="text-success">{{ $status }}</span>
                                @break
                            @case('进行中')
                                <span class="text-warning">{{ $status }}</span>
                                @break
                            @case('已逾期')
                                <span class="text-danger">{{ $status }}</span>
                                @break
                            @default
                                <span class="text-muted">未开始</span>
                        @endswitch
                        -->
                    </td>
                @endforeach
            </tr>
        @endforeach
    </tbody>
</table>

可选优化点

  • 如果user字段存储的是用户ID,需要展示用户名的话,查询数据时添加关联预加载即可:$allRecords = \App\Models\YourModel::with('user')->get();,分组时替换为->groupBy('user.name')即可。
  • 数据量较大的情况下,可以在SQL层直接做交叉表查询,减少PHP层的数据处理开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:03