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
相关产品推荐
相关产品推荐

