Sequelize一对多关联生成多余UserUserId列的问题求助
问题解决:Sequelize生成多余
UserUserId列 问题原因
你定义的User.hasMany(Message, { as: "Messages" })和User.hasMany(Request, { as: "Requests" })没有明确指定关联对应的外键,Sequelize会自动生成默认外键列(比如UserUserId)。但实际上你的Message和Request表已经通过belongsTo关联了两个User外键(发送者和接收者),这两个未指定外键的hasMany就导致了多余列的生成。
解决方案
需要给User和Message、User和Request的hasMany关联分别指定别名和对应的外键,明确区分发送者和接收者的关联:
修改context.js中的关联代码
将原来的关联代码替换为:
// User作为发送者关联Message User.hasMany(Message, { as: "SentMessages", foreignKey: "sender_user_id", sourceKey: "user_id" }); // User作为接收者关联Message User.hasMany(Message, { as: "ReceivedMessages", foreignKey: "target_user_id", sourceKey: "user_id" }); // Message关联发送者User Message.belongsTo(User, { as: "Sender", foreignKey: "sender_user_id", targetKey: "user_id" }); // Message关联接收者User Message.belongsTo(User, { as: "Receiver", foreignKey: "target_user_id", targetKey: "user_id" }); // User作为发送者关联Request User.hasMany(Request, { as: "SentRequests", foreignKey: "sender_user_id", sourceKey: "user_id" }); // User作为接收者关联Request User.hasMany(Request, { as: "ReceivedRequests", foreignKey: "target_user_id", sourceKey: "user_id" }); // Request关联发送者User Request.belongsTo(User, { as: "Sender", foreignKey: "sender_user_id", targetKey: "user_id" }); // Request关联接收者User Request.belongsTo(User, { as: "Receiver", foreignKey: "target_user_id", targetKey: "user_id" });
关键说明
- 给每个
hasMany和belongsTo关联指定唯一的as别名,让Sequelize能区分不同的关联关系 - 在
hasMany中明确指定foreignKey(对应子表中的外键字段)和sourceKey(对应主表中的主键字段) - 这样Sequelize就不会自动生成多余的默认外键列,而是使用你已经定义好的
sender_user_id和target_user_id
后续操作
修改完成后,重新运行项目,使用sync({ force: true })重新生成表,多余的UserUserId列就会消失。
内容的提问来源于stack exchange,提问作者Alex Wright
相关产品推荐
相关产品推荐

