Skip to main content

创建关联

只要所有元素都是新元素,就可以一步创建带有嵌套关联的实例.

相反,无法执行涉及嵌套对象的更新和删除. 为此,你将必须明确执行每个单独的操作.

BelongsTo / HasMany / HasOne 关联#

考虑以下模型:

class Product extends Model {}Product.init({  title: Sequelize.STRING}, { sequelize, modelName: 'product' });class User extends Model {}User.init({  firstName: Sequelize.STRING,  lastName: Sequelize.STRING}, { sequelize, modelName: 'user' });class Address extends Model {}Address.init({  type: DataTypes.STRING,  line1: Sequelize.STRING,  line2: Sequelize.STRING,  city: Sequelize.STRING,  state: Sequelize.STRING,  zip: Sequelize.STRING,}, { sequelize, modelName: 'address' });
// 我们保存关联设置调用的返回值,以便以后使用Product.User = Product.belongsTo(User);User.Addresses = User.hasMany(Address);// 也适用于 `hasOne`

一个新的 Product,User 和一个或多个 Address 可以按以下步骤一步创建:

return Product.create({  title: 'Chair',  user: {    firstName: 'Mick',    lastName: 'Broadstone',    addresses: [{      type: 'home',      line1: '100 Main St.',      city: 'Austin',      state: 'TX',      zip: '78704'    }]  }}, {  include: [{    association: Product.User,    include: [ User.Addresses ]  }]});

观察 Product.create 调用中 include 参数的用法. 这对于 Sequelize 理解与关联一起创建的内容很有必要.

注意:这里,我们的用户模型称为user,小写的u-这意味着对象中的属性也应为user. 如果给sequelize.define的名称是User,则对象中的 key 也应该是User. 对于 addresses 也是如此,除了它是 hasMany 关联的复数形式.

一个别名 BelongsTo 关联#

可以扩展前面的示例以支持关联别名.

const Creator = Product.belongsTo(User, { as: 'creator' });
return Product.create({  title: 'Chair',  creator: {    firstName: 'Matt',    lastName: 'Hansen'  }}, {  include: [ Creator ]});

HasMany / BelongsToMany 关联#

让我们介绍将产品与许多标签关联的功能. 设置模型如下所示:

class Tag extends Model {}Tag.init({  name: Sequelize.STRING}, { sequelize, modelName: 'tag' });
Product.hasMany(Tag);// 也适用于 `belongsToMany`.

现在,我们可以通过以下方式创建具有多个标签的产品:

Product.create({  id: 1,  title: 'Chair',  tags: [    { name: 'Alpha'},    { name: 'Beta'}  ]}, {  include: [ Tag ]})

并且,我们可以修改此示例以支持别名:

const Categories = Product.hasMany(Tag, { as: 'categories' });
Product.create({  id: 1,  title: 'Chair',  categories: [    { id: 1, name: 'Alpha' },    { id: 2, name: 'Beta' }  ]}, {  include: [{    association: Categories,    as: 'categories'  }]})