如何在Sequelize+TypeScript中定义多对多关联?解决关联报错
解决Sequelize多对多关联报错:"CategoryModel is not associated to ProjectModel!"
问题描述
已尝试过其他相关帖子但未解决问题。尝试通过ProjectCategoryModel定义CategoryModel与ProjectModel的多对多关联时,出现报错:"CategoryModel is not associated to ProjectModel!"。尝试设置ProjectCategory.associate = () => {}无效,因为associate不存在。
问题代码
class ProjectCategoryModel extends Model { projectId!: number; categoryId!: number; } ProjectCategoryModel.init({ projectId: { type: INTEGER, primaryKey: true, }, categoryId: { type: INTEGER, primaryKey: true, }, }, { sequelize: db, tableName: 'project_category', underscored: true, timestamps: false, }); CategoryModel.belongsToMany(ProjectModel, { as: 'project', through: ProjectCategoryModel, foreignKey: 'project_id', otherKey: 'category_id', }); ProjectModel.belongsToMany(CategoryModel, { as: 'category', through: ProjectCategoryModel, foreignKey: 'category_id', otherKey: 'project_id', }); export default ProjectCategoryModel;
解决方案
报错核心原因是belongsToMany配置中foreignKey和otherKey的对应关系搞反了,同时as的命名建议使用复数形式(符合多对多关联返回集合的语义)。以下是修正后的代码:
class ProjectCategoryModel extends Model { projectId!: number; categoryId!: number; } ProjectCategoryModel.init({ projectId: { type: INTEGER, primaryKey: true, }, categoryId: { type: INTEGER, primaryKey: true, }, }, { sequelize: db, tableName: 'project_category', underscored: true, timestamps: false, }); // Category关联Project:foreignKey是Category在中间表的外键category_id,otherKey是Project的外键project_id CategoryModel.belongsToMany(ProjectModel, { as: 'projects', // 复数形式,对应多个Project through: ProjectCategoryModel, foreignKey: 'category_id', otherKey: 'project_id', }); // Project关联Category:foreignKey是Project在中间表的外键project_id,otherKey是Category的外键category_id ProjectModel.belongsToMany(CategoryModel, { as: 'categories', // 复数形式,对应多个Category through: ProjectCategoryModel, foreignKey: 'project_id', otherKey: 'category_id', }); export default ProjectCategoryModel;
额外说明
- 中间表模型不需要定义
associate方法,Sequelize会通过主模型的belongsToMany配置自动处理关联逻辑 - 确保
CategoryModel和ProjectModel已经正确导入,且在定义关联前已经完成模型初始化 - 查询关联数据时,要使用配置的
as名称,比如CategoryModel.findOne({ include: 'projects' })
内容的提问来源于stack exchange,提问作者Adson Gomes Olivera
相关产品推荐
相关产品推荐

