メインコンテンツへスキップ
バージョン: v6 - 安定版

関連付けスコープ

このセクションでは、モデルスコープと似ていますが同じではない関連付けスコープについて説明します。

関連付けスコープは、関連付けられたモデル(関連付けのターゲット)と、多対多関係のスルーテーブルの両方に配置できます。

概念

Model.scope('foo').findAll()などのモデルの静的呼び出しにモデルスコープが自動的に適用されるのと同様に、関連付けスコープは、モデルからインスタンス(モデル自身ではなくインスタンス)によって呼び出されるメソッド呼び出しに自動的に適用されるルール(より正確には、デフォルト属性とオプションのセット)です。ここで、インスタンス呼び出しとは、インスタンスから呼び出されるメソッド呼び出しを意味します。ミキシンは、インスタンスメソッドの主な例です(instance.getSomethinginstance.setSomethinginstance.addSomethinginstance.createSomething)。

関連付けスコープは、モデルスコープと同様に、どちらもwhere句などの自動的な適用をファインダークエリに引き起こします。違いは、モデルスコープが静的ファインダークエリに適用されるのに対し、関連付けスコープはミキシンなどのインスタンスファインダークエリに自動的に適用されることです。

モデルFooBar間の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を生成します。