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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:40:26