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

Sequelize原生查询如何将一对多关联的子数据分组为数组格式

实现方案

Sequelize 的 nest: true 配置仅支持将点分隔的查询字段映射为嵌套对象,无法自动处理一对多关联的数组聚合,你可以在获取查询结果后通过手动分组实现需求,代码如下:

const mainAndLastGroups = await sequelize.query(
  // 你的原生SQL保持不变
  `
  SELECT
      MG.LOGICALREF AS [id], 
      MG.CODE AS [code],
      MG.NAME AS [name],
      LG.LOGICALREF AS [lastGroups.id],
      LG.CODE AS [lastGroups.code],
      LG.NAME AS [lastGroups.name]
  FROM
      ITEMS AS MG
      LEFT JOIN ITEMS AS LG ON LG.CARDTYPE = 1 
      AND LG.SPECODE = 'ALT GRUP' 
      AND LG.ACTIVE = 0 
      AND MG.CODE = LEFT ( LG.CODE, LEN( MG.CODE ) ) 
  WHERE
      MG.CARDTYPE = 1 
      AND MG.SPECODE = 'ANA GRUP'
  `,
  {
    nest: true,
    type: QueryTypes.SELECT,
  }
);

// 新增分组聚合逻辑
const groupMap = new Map();
mainAndLastGroups.forEach(item => {
  const mainGroupKey = item.id;
  // 主组不存在则初始化
  if (!groupMap.has(mainGroupKey)) {
    groupMap.set(mainGroupKey, {
      id: item.id,
      code: item.code,
      name: item.name,
      lastGroups: []
    });
  }
  // 过滤LEFT JOIN产生的空lastGroups数据
  if (item.lastGroups?.id) {
    groupMap.get(mainGroupKey).lastGroups.push(item.lastGroups);
  }
});

// 最终结果
const result = Array.from(groupMap.values());

扩展多层嵌套的方法

如果后续需要嵌套更多层级的数组,只需要两步调整:

  • SQL查询里新增对应层级的点分隔别名,比如三级分组可以命名为 lastGroups.subGroups.id
  • 在聚合逻辑里新增层级的分组判断,和当前主组分页逻辑一致即可

该方案不需要依赖Sequelize的Model定义,完全适配旧系统表结构不可修改的场景,兼容性更强,不依赖特定数据库的语法特性。

内容的提问来源于stack exchange,提问作者Agamyrat Chariyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:39:04