Sequelize.hasMany/belongsTo中的foreignKey是啥意思?

Posted

技术标签:

【中文标题】Sequelize.hasMany/belongsTo中的foreignKey是啥意思?【英文标题】:What's the meaning of foreignKey in Sequelize.hasMany/belongsTo?Sequelize.hasMany/belongsTo中的foreignKey是什么意思? 【发布时间】:2020-03-04 11:59:28 【问题描述】:

我最近在使用 Sequelize ORM。

我有两张桌子。一个是Users,另一个是Posts

这两个表的架构如下

Users 
  id: Integer,
  name: String,
  age: Integer


Posts 
  id: Integer,  // refers to the id of post itself
  author_id: Integer, // refers to the id of the author of this post
  title: String,
  content: String

我想在它们之间创建一个(用户)对多(帖子)关联。为此,我需要在模型中指定 hasManybelongsTo

但是,我对参数foreignKey / sourceKey / targetKey的含义很困惑。

假设我已经使用迁移定义并创建了我的表。在这种情况下,作为 foreignKey 的属性的名称是 author_id

我的猜测是,在belongsTo 中,foreignKey 的意思是“源表中将成为 foreignKey 的属性的名称”?

但在hasMany 中,foreignKey 表示“即将到来的foreignKey 所引用的属性的名称”

所以,belongsTo 中的 foreignKey 将是 author_id(在表 Posts 中)但 foreignKeyhasMany 中将是 id(在表 Users 中) ?

另外,sourceKey/targetKey到底是什么意思!?

【问题讨论】:

【参考方案1】:

嗯...您在上面有一个有趣的案例...如果您使用 user_id 而不是 author_id 那么您可能会逃脱而无需将这些声明为 sequelize 可能会正确假设它们...但是因为您将其命名为 author_id 那么您的 hasMany 肯定需要知道外键在您的 post 表中被命名为 author_id ...假设您在用户表中将您的 id 命名为“user”而不是“id”....好吧 sequelize 不会理解并且能够推断出它加入了什么,所以你会说 sourceKey = "user" 和 foreignKey = "author_id"... 为了进一步说明,你可能会在数据库设计中遇到问题,你需要指定什么targetKey 或 otherKey 是因为有人将事情命名为古怪......所以就像你上面在你的 belongsTo author_id 中所说的那样,它不知道它应该映射回“用户”以进行加入,所以你会指定 foreignKey = “author_id”和 otherKey = "user"... 这东西花了我一段时间才把我的头包裹起来好吧,因为我没有设计数据库是针对实现 graphql/sequelize... 因此我不得不在我的联接中广泛使用 sourceKey、targetKey 和 otherKey 等..

尝试并真正合乎逻辑地思考它,它会更有意义......如果您的主键始终是“id”并且您的foreignKey始终是“tablename_id”,那么您无需过多担心其他属性..但是当命名不一致时,sequelize 需要被告知要使用什么键,这就是为什么存在其他属性的原因.. Sequelize 非常聪明,但它无法弥补糟糕的数据库设计或糟糕的连接列命名...希望这会有所帮助,如果没有,我可以为您发布很多示例.. 干杯

【讨论】:

感谢您的解释。但是,我仍然对一件事感到困惑。我看到很多例子都对 hasMany 和 belongsTo 使用了相同的外键名。但是我看到文档说hasMany中的foreignKey是“目标表”中外键属性的名称,belongsTo中的foreignKey是“源表”中外键属性的名称。它们不应该是不同的,因为它们在不同的表中有不同的名称(例如,用户表的 id 和 Posts 表的 user_id)? 这是正确的,是的...如果存在,hasMany 外键将是 user_id,但您将其设为 author_id...。您可能必须将 sourceKey 设置为 author_id,将 foreignKey 设置为 if 在您的 belongsTo

以上是关于Sequelize.hasMany/belongsTo中的foreignKey是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章