区分外键目标与源

leo*_*ger 2 sequelize.js

我一直在使用sequelize,但是从不费心去真正了解它的foreignKey工作原理。他们在文档中指出:

目标键是目标模型上源模型上的外键列所指向的列。

那么在以下情况下,目标是什么?

    Route.belongsTo(models.Subarea, {
      foreignKey: 'subareaId',
      as: 'subarea',
    });

    Route.belongsToMany(models.Book, {
      through: models.BookRoute,
      foreignKey: 'routeId',
      as: 'books',
    });
Run Code Online (Sandbox Code Playgroud)

我的困惑在于为什么在第一种情况下我将ForeignKey放在SubareaId上,而在第二种情况下我将其作为routeId。如果foreignKey应该是sourceId,那么在两种情况下都不应该是routeId吗?

mus*_*ons 6

我建议按以下步骤进行推理:

  1. 确定模型和目标模型。这只是约定俗成:来源是在其上调用方法的模型,因此基本上在表示法中是“左边的那个”。目标是另一种模型,因此“右边的那个”。
  2. 知道各种方法将外键放在哪里:然后将fk放在目标上 ; 把fk放在源头上 ; 把fk放在贯通模型上hasOnehasManybelongsTobelongsToMany
  3. 了解外键(顾名思义)将引用“另一个模型”(因此不是2以下的模型)。因此hasOne,这hasMany将是对源模型的参考;供belongsTo目标模型参考;作为belongsToMany对源模型的引用(您可以使用引用目标模型otherKey:)。

belongsToMany这是一种特殊情况,因为引入了第三个模型:直通模型(或联接表),在该模型上存储了源和目标的外键。这在某种程度上改变了外键的“视角”,因此您无法将其与belongsTo外键引用进行完全比较。

因此,回答您的问题:

  • 目标是哪一个:分区和书本。
  • 使用哪个外键?:您的外键符合上述说明。belongsToMany由于外键既不存储在源也不存储在目标上,而是存储在直通模型上,因此是例外。