Sequelize关联MySQL时外键生成异常问题求助
解决Sequelize关联外键异常问题
问题原因
你的关联关系配置不匹配:在Category.hasMany和Brand.hasMany中未明确指定外键,而Product.belongsTo中指定了category_id和brand_id作为外键。由于模型使用了自定义主键(如Category的category_id而非默认id),Sequelize无法自动匹配关联字段,因此生成了默认格式的外键(category_category_id、brand_brand_id),同时你在belongsTo中指定的字段也被创建,导致重复且关联失效。
另外,Product模型中thumb_image字段的set方法存在拼写错误:this.setDataValue("thumbImage", ...)应该改为this.setDataValue("thumb_image", ...),否则会导致该字段存储异常。
修复步骤
1. 修改Category模型的关联配置
在Category.associate中添加foreignKey参数,与Product中指定的外键一致:
Category.associate = (models) => { Category.hasMany(models.Product, { foreignKey: "category_id" // 指定外键为Product中的category_id }); };
2. 修改Brand模型的关联配置
同样在Brand.associate中添加foreignKey参数:
Brand.associate = (models) => { Brand.hasMany(models.Product, { foreignKey: "brand_id" // 指定外键为Product中的brand_id }); };
3. 修复Product模型的thumb_image字段拼写错误
thumb_image: { type: DataTypes.STRING, allowNull: true, get() { if (this.getDataValue("thumb_image")) { return JSON.parse(this.getDataValue("thumb_image")); } return []; }, set(val) { this.setDataValue("thumb_image", JSON.stringify(val)); // 改为thumb_image而非thumbImage }, },
验证修复
由于你的配置中开启了{ force: process.env.NODE_ENV === "development" },重新运行项目后会自动删除并重建数据库表。此时products表会生成正确的category_id和brand_id外键字段,多余的category_category_id、brand_brand_id会被移除。
之后你可以正常使用include进行关联查询,例如:
const products = await db.Product.findAll({ include: [db.Category, db.Brand] });
内容的提问来源于stack exchange,提问作者Wachiye
相关产品推荐
相关产品推荐

