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

