Sequelize多对多嵌套关联查询:如何获取中间表关联的完整实体对象
关联定义修正
首先你当前的关联定义存在笔误,重复声明了Game对GameTeam的一对多关联,漏了Team对GameTeam的关联,修正后的关联代码如下:
Team.belongsToMany(Game, { through: GameTeam }); Game.belongsToMany(Team, { through: GameTeam }); // 替换原有重复的Game.hasMany定义 Team.hasMany(GameTeam, { onDelete: 'CASCADE' }); GameTeam.belongsTo(Team); Game.hasMany(GameTeam, { onDelete: 'CASCADE' }); GameTeam.belongsTo(Game); Stadium.hasMany(GameTeam); GameTeam.belongsTo(Stadium);
注:多对多关联的through参数直接传入GameTeam模型实例,比传字符串更稳妥,可避免命名匹配错误。
查询代码修改
你需要在查询的include配置中,对Game关联添加through.include配置,嵌套加载中间表关联的Stadium模型,若需要在gameteam字段中显式返回完整的Team、Game对象,也可以同步加入嵌套加载列表:
const getTeamById = async (teamId) => { return await Team.findByPk(teamId, { include: [ { model: Game, through: { include: [ { model: Stadium }, // 不需要在gameteam中重复返回Team、Game的话可删除下面两行 { model: Team }, { model: Game } ] } } ] }); };
备选方案
如果你不需要保留外层Team → games的层级结构,也可以直接从中间表GameTeam出发查询,写法更简洁:
const getTeamById = async (teamId) => { return await GameTeam.findAll({ where: { teamId }, include: [Team, Game, Stadium] }); };
补充说明
你提到的多对多示例中从grant字段获取完整关联对象的需求,解决逻辑完全一致:在多对多关联的through配置中添加include,嵌套加载对应的关联模型即可。
内容的提问来源于stack exchange,提问作者Nikos K.
相关产品推荐
相关产品推荐

