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

Laravel 10如何单查询实现同表按列分组展示层级列表

实现Laravel 10中Type-Name嵌套列表的单次查询方案

完全可以通过单次查询+内存分组实现页面首次加载时的嵌套列表展示,不需要依赖数据库聚合函数或异步加载,以下是两种可行方案:

方案一:Laravel集合分组(推荐)

数据库仅执行一次查询获取所有数据,后续通过Laravel集合的groupBy方法在内存中按Type分组,避开数据库分组的聚合限制。

控制器代码

public function showList()
{
    // 仅查询需要的Type和Name列,减少数据传输
    $groupedItems = MyClass::select('Type', 'Name')->get()->groupBy('Type');
    return view('your-view-name', compact('groupedItems'));
}

注意:将MyClass替换为你实际的模型类名,your-view-name替换为对应的blade视图文件名。

Blade视图代码

通过嵌套循环直接渲染嵌套列表:

<ul class="type-list">
    @foreach($groupedItems as $type => $nameItems)
        <li class="type-item">
            <strong>{{ $type }}</strong>
            <ul class="name-list">
                @foreach($nameItems as $item)
                    <li class="name-item">{{ $item->Name }}</li>
                @endforeach
            </ul>
        </li>
    @endforeach
</ul>

方案二:纯SQL分组(备选)

如果偏好通过SQL直接返回分组结构,可使用GROUP_CONCAT聚合函数将同Type的Name拼接为字符串,再在后端拆分:

控制器代码

public function showList()
{
    $groupedItems = DB::table('your_table_name')
        ->selectRaw('Type, GROUP_CONCAT(DISTINCT Name SEPARATOR \'|\') AS names')
        ->groupBy('Type')
        ->get()
        ->map(function($row) {
            // 拆分拼接的字符串为数组,注意分隔符要选Name中不会出现的字符
            $row->names = explode('|', $row->names);
            return $row;
        });
    return view('your-view-name', compact('groupedItems'));
}

Blade视图代码

<ul class="type-list">
    @foreach($groupedItems as $row)
        <li class="type-item">
            <strong>{{ $row->Type }}</strong>
            <ul class="name-list">
                @foreach($row->names as $name)
                    <li class="name-item">{{ $name }}</li>
                @endforeach
            </ul>
        </li>
    @endforeach
</ul>

提示:方案二需要注意选择不会出现在Name字段中的分隔符,避免拆分错误,因此优先推荐方案一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:14:53