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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:01:02