我一直在使用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吗?
我建议按以下步骤进行推理:
hasOnehasManybelongsTobelongsToManyhasOne,这hasMany将是对源模型的参考;供belongsTo目标模型参考;作为belongsToMany对源模型的引用(您可以使用引用目标模型otherKey:)。belongsToMany这是一种特殊情况,因为引入了第三个模型:直通模型(或联接表),在该模型上存储了源和目标的外键。这在某种程度上改变了外键的“视角”,因此您无法将其与belongsTo外键引用进行完全比较。
因此,回答您的问题:
belongsToMany由于外键既不存储在源也不存储在目标上,而是存储在直通模型上,因此是例外。