如何在Laravel中实现按年份分组的Bootstrap标签页数据展示
实现按年份分组的Bootstrap标签页展示方案
控制器查询语句编写
你可以利用Laravel集合的groupBy方法轻松实现按年份分组,这种方式无需复杂的数据库聚合操作,直接获取对应年份的所有记录:
public function showPlacements() { // 查询所有placement记录,按年份倒序排列后按year字段分组 $placements = \App\Models\Placement::orderBy('year', 'desc') ->get() ->groupBy('year'); return view('placements', compact('placements')); }
如果你的数据量极大,担心集合分组性能,也可以先获取所有唯一年份,再逐个查询对应记录(避免N+1查询的优化写法):
public function showPlacements() { // 获取所有唯一年份并倒序排列 $years = \App\Models\Placement::distinct()->orderBy('year', 'desc')->pluck('year'); $placements = []; foreach ($years as $year) { $placements[$year] = \App\Models\Placement::where('year', $year)->get(); } return view('placements', compact('placements')); }
视图代码调整(适配Bootstrap nav-pills)
将你的blade视图修改为动态生成标签和内容面板:
<!-- 标签头部 --> <ul class="nav nav-pills mb-3" id="yearTabs" role="tablist"> @foreach($placements as $year => $records) <li class="nav-item" role="presentation"> <button class="nav-link {{ $loop->first ? 'active' : '' }}" id="tab-{{ $year }}" data-bs-toggle="pill" data-bs-target="#content-{{ $year }}" type="button" role="tab" aria-controls="content-{{ $year }}" aria-selected="{{ $loop->first ? 'true' : 'false' }}"> {{ $year }} </button> </li> @endforeach </ul> <!-- 标签内容区域 --> <div class="tab-content" id="yearTabContent"> @foreach($placements as $year => $records) <div class="tab-pane fade {{ $loop->first ? 'show active' : '' }}" id="content-{{ $year }}" role="tabpanel" aria-labelledby="tab-{{ $year }}"> <table class="table table-bordered"> <thead> <tr> <th>姓名</th> <th>公司</th> <th>状态</th> </tr> </thead> <tbody> @foreach($records as $item) <tr> <td>{{ $item->name }}</td> <td>{{ $item->company }}</td> <td>{{ $item->status }}</td> </tr> @endforeach </tbody> </table> </div> @endforeach </div>
关键说明
- 控制器中
groupBy('year')会将查询结果转换为以年份为键、对应年份所有记录为值的集合,完美匹配标签页的分组展示需求 - 视图中利用
$loop->first实现第一个标签页默认激活的效果,符合Bootstrap组件的交互逻辑 - 动态生成的
id和aria-*属性保证了标签与内容的正确关联,同时满足无障碍访问规范
内容的提问来源于stack exchange,提问作者Sona Ramesh
相关产品推荐
相关产品推荐

