【问题标题】:sequelize foreign key target vs source续集外键目标与源
【发布时间】:2018-02-12 23:10:38
【问题描述】:

我一直在使用 sequelize,但从未真正理解 foreignKey 的实际工作原理。他们在他们的文档中声明:

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

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

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

    Route.belongsToMany(models.Book, {
      through: models.BookRoute,
      foreignKey: 'routeId',
      as: 'books',
    });

我的困惑是为什么在第一种情况下我将 foreignKey 放在 SubareaId 上,但在第二种情况下我把它作为 routeId。如果foreignKey应该是sourceId,这两种情况下都不应该是routeId吗?

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

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

    1. 确定来源目标模型。这只是约定:源是调用方法的模型,所以基本上是符号中的“左边的那个”。目标是另一个模型,所以是“右边那个”。
    2. 知道哪里各种方法把外键hasOnehasMany把fk放在target上; belongsTo 将 fk 放在 source 上; belongsToMany 将 fk 置于直通模型上。
    3. 了解外键(顾名思义)将引用“另一个模型”(因此不是 2 下的模型)。所以对于hasOnehasMany 将是对源模型的引用; belongsTo 是对目标模型的引用;对于belongsToMany,引用源模型(您可以使用otherKey: 引用目标模型)。

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

    所以回答你的问题:

    • 目标是什么?:分别是Subarea和Book。
    • 使用哪个外键?:您的外键与上述一致 解释。 belongsToMany 作为外键是例外的 既不存储在源也不存储在目标上,而是存储在直通模型上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-10
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2020-06-25
      • 1970-01-01
      • 2020-10-23
      相关资源
      最近更新 更多