如何使用Sequelize将班级数据分组存入数组?
按班级分组数据的实现方案
你当前的查询已经关联了目标表,但SQL层面的group是做聚合统计用的,和你要的「把同一班级的所有关联数据存入数组」不是一回事。可以在查询完成后用JavaScript手动分组,下面是具体实现:
优化后的查询与分组代码
const GetInfoClass = async () => { try { const data = await db.Information_Class.findAll({ include: [ { model: db.Parent }, { model: db.Class }, { model: db.Subject }, ], raw: true, nest: true, // 移除原SQL分组,先拿到所有关联数据再处理 }); // 按班级ID分组,聚合同一班级的所有数据 const groupedByClass = data.reduce((acc, item) => { const classId = item.Class.id; if (!acc[classId]) { acc[classId] = { classInfo: item.Class, // 存储班级基础信息 relatedData: [] // 存储该班级下的所有关联数据 }; } acc[classId].relatedData.push({ parent: item.Parent, subject: item.Subject, infoClassId: item.id }); return acc; }, {}); // 转成数组格式(如果需要对象格式可直接返回groupedByClass) return Object.values(groupedByClass); } catch (err) { console.log(err); throw err; // 抛出错误让调用方处理 } };
关键说明
- 去掉了原函数里冗余的
new Promise包裹,async函数本身会返回Promise,无需额外包装 - 移除SQL层面的
group,确保能拿到所有关联的原始数据 - 用
Array.reduce遍历结果,以班级ID为标识,把同一班级的关联数据聚合到对应数组中 - 最终可选择返回「键为班级ID的对象」或「纯数组格式」,按需调整即可
如果你的需求是SQL层面的聚合统计(比如每个班级的关联数据数量),可以结合sequelize.fn使用聚合函数,但要保留完整关联数据的话,客户端手动分组更灵活。
内容的提问来源于stack exchange,提问作者Hoàng Phúc
相关产品推荐
相关产品推荐

