Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 什么';Sequelize.hasMany/belongsTo中foreignKey的含义是什么?_Mysql_Orm_Sequelize.js_Rdbms - Fatal编程技术网

Mysql 什么';Sequelize.hasMany/belongsTo中foreignKey的含义是什么?

Mysql 什么';Sequelize.hasMany/belongsTo中foreignKey的含义是什么?,mysql,orm,sequelize.js,rdbms,Mysql,Orm,Sequelize.js,Rdbms,我最近正在使用Sequelize ORM 我有两张桌子。一个是用户,另一个是帖子 这两个表的模式如下所示 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: Str

我最近正在使用Sequelize ORM

我有两张桌子。一个是
用户
,另一个是
帖子

这两个表的模式如下所示

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的含义感到非常困惑

假设我已经用迁移定义并创建了表。在本例中,作为外键的属性的名称为author\u id

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

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

因此,
belongsTo
中的
foreignKey
将是作者id(在表格帖子中),但
中的
foreignKey
有许多
将是id(在表格用户中)


此外,sourceKey/targetKey到底意味着什么

嗯。。。你有一个有趣的案例在上面。。。如果您使用的是用户id而不是作者id,那么您可能不需要声明它们,因为sequelize可能会正确地假定它们。。。但是,因为您将其命名为author\u id,所以您的hasMany肯定需要知道在post表中外键的名称为author\u id。。。假设您在用户表中将id命名为“user”而不是“id”。。。。sequelize无法理解这一点,也无法推断它加入了什么,所以您可以说sourceKey=“user”和foreignKey=“author\u id”。。。为了进一步说明这一点,您可能会在数据库设计中遇到一些问题,您需要指定targetKey或otherKey是什么,因为有人将其命名为古怪的。。。因此,正如您在上文的“您的归属”中所说,作者id不知道它应该映射回“用户”进行加入,因此您可以指定foreignKey=“author\u id”和otherKey=“user”。。。这件事也花了我一段时间来思考,因为我没有设计实现graphql/sequelize的数据库。。。因此,我必须在连接中广泛使用sourceKey、targetKey和otherKey等


试着从逻辑上考虑,这样会更有意义。。。如果您的主键始终为“id”,而foreignKey始终为“tablename\u id”,那么您就不必太担心其他属性。。但是当命名不一致时,sequelize需要被告知要使用什么键,这就是为什么存在其他属性的原因。。Sequelize非常聪明,但它无法弥补糟糕的数据库设计或糟糕的联接列命名。。。希望这对你有所帮助,如果没有的话,我可以给你发很多例子。。干杯

谢谢你的解释。然而,有一件事我仍然感到困惑。我看到很多例子对hasMany和belongsTo使用了相同的foreignKey名称。但是我看到文档说hasMany中的foreignKey是“目标表”中外键属性的名称,belongsTo中的foreignKey是“源表”中外键属性的名称。因为它们在不同的表中有不同的名称(例如,Users表的id和Posts表的user_id),所以它们不应该不同吗。。。hasMany外键可能是user\u id(如果存在的话),但您将其设置为author\u id。。。。您可能需要将sourceKey设置为author\u id,将foreignKey设置为if in your belongsTo