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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:22:15