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

