如何从device与device_category表生成含设备数组的分类JSON结构?
分类与设备关联数据结构解决方案
你的表结构
device_category('id_category', 'name_category'); device('id_device', 'name_device', 'category_device');
你要的分类嵌套设备的JSON结构,两种方式都能实现:
方式一:单条SQL直接生成目标结构
如果你的数据库支持JSON聚合函数(比如MySQL 5.7+/PostgreSQL 9.4+),可以直接用一条查询搞定,不用在代码里额外处理。
MySQL 示例:
SELECT dc.id_category, dc.name_category, JSON_ARRAYAGG( JSON_OBJECT( 'id_device', d.id_device, 'name_device', d.name_device, 'id_category', dc.id_category ) ) AS device FROM device_category dc LEFT JOIN device d ON dc.id_category = d.category_device GROUP BY dc.id_category, dc.name_category;
执行这条查询后,直接把结果转成JSON返回就是你要的结构。
PostgreSQL 示例:
SELECT dc.id_category, dc.name_category, json_agg( json_build_object( 'id_device', d.id_device, 'name_device', d.name_device, 'id_category', dc.id_category ) ) AS device FROM device_category dc LEFT JOIN device d ON dc.id_category = d.category_device GROUP BY dc.id_category, dc.name_category;
方式二:应用层先查分类再关联设备
如果数据库不支持JSON函数,或者你更习惯在代码层处理,就先查所有分类,再批量获取设备并分组关联:
以PHP框架(比如Laravel)为例,DeviceController的get()方法可以这么写:
// 1. 获取所有分类数据 $categories = DeviceCategory::select('id_category', 'name_category')->get(); // 2. 获取所有设备并按分类ID分组 $groupedDevices = Device::all()->groupBy('category_device'); // 3. 给每个分类绑定对应的设备数组 $categories->transform(function ($category) use ($groupedDevices) { $category->device = $groupedDevices->get($category->id_category, []); return $category; }); // 4. 返回JSON return response()->json($categories);
总结
- 单条SQL查询效率更高,减少数据库交互次数,但依赖数据库版本;
- 应用层处理兼容性强,逻辑直观,不用考虑数据库差异。
内容的提问来源于stack exchange,提问作者Haifisch
相关产品推荐
相关产品推荐

