使用 Sequelize 的一对多关系创建的外键比预期的多

问题描述

我一直在尝试使用 Sequelize 为类项目在 MysqL 中建模一些表及其关系。它适用于除“消息”之外的所有表。它与另一个表“用户”有两个一对多关系。表的定义如下所示:Table Definition

要定义该关系,您需要在引用“Users”的表“Messages”上添加两个非空外键。到目前为止一切顺利。

下一步是使用 Sequelize 实现这一点:

if __name__ == "__main__":
    trainTestResults = GGSCrossVal(data,25,[10,1,0.1,0.01,0.001,0.0001],[],False)

当我在启动服务器时检查 Sequelize 提供的输出时,所有这些问题就出现了。这是给 MysqL 创建表“Message”的实际命令。它创建了三个指向“User”的外键:“receiversId”、“transmittersId”和“userId”。输出如下所示:

db.Message.belongsTo(db.User,{as: 'receivers',foreignKey: {allowNull: false}});
db.Message.belongsTo(db.User,{as: 'transmitters',foreignKey: {allowNull: false}});

db.User.hasMany(db.Message,foreignKey: {allowNull: false}})
db.User.hasMany(db.Message,foreignKey: {allowNull: false}})

我尝试了多种形式,但始终创建​​了第三个“userId”外来形式,我不知道为什么。关于我做错了什么的任何建议?或者它只是 Sequelize 的一个错误?或者我可以忽略那个“userId”?

谢谢。

解决方法

您肯定需要明确指出两端的外键列并且相同。并且不要混淆 belongsTohasMany 的别名。对于某个关联的两端,它们不应该相同:

db.Message.belongsTo(db.User,{as: 'receiver',foreignKey: {allowNull: false,name: 'receiverId' }});
db.Message.belongsTo(db.User,{as: 'transmitter',name: 'transmitterId' }});

db.User.hasMany(db.Message,{as: 'receivedMessages',name: 'receiverId' }})
db.User.hasMany(db.Message,{as: 'transmittedMessages',name: 'transmitterId' }})

别名是作为第一个参数传递给 belongsTo/hasMany 的模型的名称,以指示此传递的模型如何与调用 belongsTo/hasMany 的模型相关。

上述别名将导致获取包含如下关联的模型实例:

// Message instance
{
  id: 1,// other message fields
  receiver: {
    id: 2,name: 'John'
  },transmitter: {
    id: 3,name: 'Luis'
  }
}
// User instance
{
  id: 3,name: 'Luis',// other user fields
  receivedMessages: [{
    id: 1,text: 'Hello'
  }],transmittedMessages: [{
    id: 2,name: 'Bye'
  }]
}