使用關聯建立
如果所有元素都是新的,則可以在一個步驟中建立帶有巢狀關聯的實例。
相反地,目前無法執行涉及巢狀物件的更新和刪除。為此,您必須明確執行每個單獨的操作。
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' },
);
// We save the return values of the association setup calls to use them later
Product.User = Product.belongsTo(User);
User.Addresses = User.hasMany(Address);
// Also works for `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
,則物件中的鍵也應該是 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);
// Also works for `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',
},
],
},
);