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

One To Many relationship using Sequelize creates more foreign keys than expected

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

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

下一步是使用 Sequelize 实现:

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,{as: 'receivers', foreignKey: {allowNull: false}})
db.User.hasMany(db.Message,{as: 'transmitters', foreignKey: {allowNull: false}})

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

Executing (default): CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER NOT NULL auto_increment , `text` TEXT NOT NULL, `date` DATETIME NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `receiversId` INTEGER NOT NULL, `transmittersId` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`receiversId`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY (`transmittersId`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;

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

谢谢。

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

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

db.User.hasMany(db.Message,{as: 'receivedMessages', foreignKey: {allowNull: false, name: 'receiverId' }})
db.User.hasMany(db.Message,{as: 'transmittedMessages', foreignKey: {allowNull: false, 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'
  }]
}