首页 > 解决方案 > Sequelize:定义关联

问题描述

阅读Sequelize我在某种程度上感到困惑的文档,Sequelize会自动为我们提供什么以及我们需要明确告诉它什么。我有两个模型:UserPost. 正如您所猜测的,一个用户可以多个帖子,而一个帖子只属于一个用户。设置各自的关系将如下所示:

Post.associate = (models) => {
  Post.belongsTo(models.users, {
    as:'user',
    foreignKey: {
      name: 'user_id',
      allowNull: false
    }
  }
}

User.associate = (models) => {
  User.hasMany(models.posts, {
    as:'posts',
    onDelete:'CASCADE',
    onUpdate:'CASCADE' 
  }
}

我的问题是:我应该foreignKey在声明关联时再指定一次hasMany,还是足以让 Sequelize 拥有foreignKey两个模型之间声明的关系之一(在示例中 - belongsTo)?

标签: node.jssequelize.js

解决方案


从我认为发生的情况来看:

  • Sequelize 会一一遍历你的所有关联
  • 如果您已经提供了外键名称,那么很好
  • 否则它将自行猜测/命名外键

就像它options.foreignKey在文档中所说的那样,例如 belongsTo :https://sequelize.org/master/class/lib/model.js~Model.html#static-method-belongsTo(对于 hasOne、hasMany、belongsToMany 的描述相同)

options.foreignKey || 字符串或对象 || 可选的

源表中外键属性的名称或表示外列类型定义的对象(请参阅 Sequelize.define 的语法)。使用对象时,可以添加 name 属性来设置列的名称。默认为目标名称+目标主键

如果 sequelize 猜测您的 foreignKey 名称,那么只有当您的 foreignKey 名称不匹配 (tableName + Id) 或 (tableName + _ + id) 时,您才会遇到问题

因此,最好自己为关联双方提供 foreignKey 名称,以免进一步面临任何问题。


推荐阅读