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

