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

Sequelize多对多关联查询如何获取家长表关联的学生列表数据

正确实现步骤

1. 多对多关联配置(推荐)

你之前的多对多关联配置缺少自定义外键声明,Sequelize默认会生成parentId、studentId作为外键名,和你实际的idParent、idStudent字段不匹配,所以会报错。
正确的关联配置如下:

db.parents.belongsToMany(db.students, {
  through: db.parentStudents,
  foreignKey: 'idParent', // 中间表指向Parents表的外键字段
  otherKey: 'idStudent' // 中间表指向Students表的外键字段
});
db.students.belongsToMany(db.parents, {
  through: db.parentStudents,
  foreignKey: 'idStudent',
  otherKey: 'idParent'
});

2. 查询代码

配置完成后直接关联查询Students模型即可,Sequelize会自动处理中间表的左连接逻辑:

const parentList = await db.parents.findAll({
  attributes: ['name'], // 仅返回Parents表的name字段
  include: [{
    model: db.students,
    attributes: ['name'], // 仅返回Students表的name字段
    through: { attributes: [] } // 不返回中间表的任何字段
  }]
});
// 按需求包装返回结构
res.json({ data: parentList });

可选:一对多关联实现方案

如果你坚持用一对多关联的写法,需要补全中间表和主表的从属关联:

// 完整一对多关联配置
db.parents.hasMany(db.parentStudents, { foreignKey: 'idParent' });
db.students.hasMany(db.parentStudents, { foreignKey: 'idStudent' });
db.parentStudents.belongsTo(db.parents, { foreignKey: 'idParent' });
db.parentStudents.belongsTo(db.students, { foreignKey: 'idStudent' });

查询时需要嵌套关联,查询后还要手动整理结构:

const rawParentList = await db.parents.findAll({
  attributes: ['name'],
  include: [{
    model: db.parentStudents,
    attributes: [],
    include: [{
      model: db.students,
      attributes: ['name']
    }]
  }],
  raw: false
});
// 手动整理成目标结构
const parentList = rawParentList.map(parent => ({
  name: parent.name,
  students: parent.parentStudents.map(item => item.student)
}));
res.json({ data: parentList });

内容的提问来源于stack exchange,提问作者Philipos D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:27:04