関連付けによる作成
すべての要素が新規であれば、ネストされた関連付けを持つインスタンスを1ステップで作成できます。
対照的に、ネストされたオブジェクトを含む更新と削除は、現時点では不可能です。そのため、各アクションを個別に明示的に実行する必要があります。
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
、および1つ以上のAddress
は、次の方法で1ステップで作成できます。
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が関連付けと共に何をしようとしているのかを理解するために必要です。
注:ここで、ユーザーモデルは小文字のuでuser
と呼ばれています。つまり、オブジェクトのプロパティもuser
である必要があります。sequelize.define
に与えられた名前がUser
だった場合、オブジェクトのキーもUser
である必要があります。hasMany
関連付けであるため、複数形のaddresses
も同様です。
エイリアス付き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',
},
],
},
);