関連付けスコープ
このセクションでは、モデルスコープと似ていますが同じではない関連付けスコープについて説明します。
関連付けスコープは、関連付けられたモデル(関連付けのターゲット)と、多対多関係のスルーテーブルの両方に配置できます。
概念
Model.scope('foo').findAll()
などのモデルの静的呼び出しにモデルスコープが自動的に適用されるのと同様に、関連付けスコープは、モデルからインスタンス(モデル自身ではなくインスタンス)によって呼び出されるメソッド呼び出しに自動的に適用されるルール(より正確には、デフォルト属性とオプションのセット)です。ここで、インスタンス呼び出しとは、インスタンスから呼び出されるメソッド呼び出しを意味します。ミキシンは、インスタンスメソッドの主な例です(instance.getSomething
、instance.setSomething
、instance.addSomething
、instance.createSomething
)。
関連付けスコープは、モデルスコープと同様に、どちらもwhere
句などの自動的な適用をファインダークエリに引き起こします。違いは、モデルスコープが静的ファインダークエリに適用されるのに対し、関連付けスコープはミキシンなどのインスタンスファインダークエリに自動的に適用されることです。
例
モデルFoo
とBar
間の1対多関連付けの関連付けスコープの基本的な例を以下に示します。
-
設定
const Foo = sequelize.define('foo', { name: DataTypes.STRING });
const Bar = sequelize.define('bar', { status: DataTypes.STRING });
Foo.hasMany(Bar, {
scope: {
status: 'open',
},
as: 'openBars',
});
await sequelize.sync();
const myFoo = await Foo.create({ name: 'My Foo' }); -
この設定の後、
myFoo.getOpenBars()
を呼び出すと、次のSQLが生成されます。SELECT
`id`, `status`, `createdAt`, `updatedAt`, `fooId`
FROM `bars` AS `bar`
WHERE `bar`.`status` = 'open' AND `bar`.`fooId` = 1;
これにより、.getOpenBars()
ミキシンを呼び出すと、関連付けスコープ{ status: 'open' }
が生成されたSQLのWHERE
句に自動的に適用されたことがわかります。
標準スコープを使用した同じ動作の実現
標準スコープを使用して同じ動作を実現できます。
// Foo.hasMany(Bar, {
// scope: {
// status: 'open'
// },
// as: 'openBars'
// });
Bar.addScope('open', {
where: {
status: 'open',
},
});
Foo.hasMany(Bar);
Foo.hasMany(Bar.scope('open'), { as: 'openBars' });
上記のコードでは、myFoo.getOpenBars()
は上記と同じSQLを生成します。