Sequelize多对多关联中间表自定义列名问题求助
解决Sequelize多对多关联中间表列名自定义问题
我完全懂你遇到的麻烦——Sequelize默认生成的中间表外键名确实有点冗余,不过只要在关联配置时**同时明确指定foreignKey和otherKey**就能完美解决这个问题。你之前只改了一个列名,是因为只在单边配置了参数,两边都设置就能统一自定义列名了。
具体解决方案
在定义belongsToMany关联时,分别为两个模型的关联配置指定foreignKey(当前模型在中间表的外键名)和otherKey(关联模型在中间表的外键名):
// Artist 与 Album 的多对多关联配置 Artist.belongsToMany(Album, { through: 'ArtistAlbums', foreignKey: 'artistId', // Artist模型对应中间表的外键列名 otherKey: 'albumId' // Album模型对应中间表的外键列名 }); Album.belongsToMany(Artist, { through: 'ArtistAlbums', foreignKey: 'albumId', // Album模型对应中间表的外键列名 otherKey: 'artistId' // Artist模型对应中间表的外键列名 });
原理说明
Sequelize默认会用「模型名+主键名」的规则生成中间表的外键列名(比如你的ArtistArtistId就是Artist模型名加上主键artistId拼接而来)。通过显式指定foreignKey和otherKey,我们可以覆盖这个默认行为,直接定义想要的列名。
需要注意的细节:
- 两边的关联配置里,
foreignKey和otherKey要对应匹配,不能搞混 - 如果已经生成了带有旧列名的中间表,需要删除旧表后重新同步(或者写迁移脚本修改列名),新的配置才会生效
为什么之前的尝试没生效?
你提到用otherKey只修改了一个列名,是因为只在其中一个模型的关联配置里设置了参数,另一个模型的关联还是沿用了Sequelize的默认规则,所以才会出现一个自定义列名、一个自动生成列名的情况。只有两边都明确配置,才能让中间表的两个外键列名都符合预期。
内容的提问来源于stack exchange,提问作者Janosch Hübner
相关产品推荐
相关产品推荐

