跳到主要內容
版本:v6 - 穩定版

關聯範圍

本節討論關聯範圍,它與模型範圍類似,但並不相同。

關聯範圍可以放置在關聯的模型(關聯的目標)上,也可以放置在多對多關係的中介表上。

概念

模型範圍自動套用於模型靜態呼叫(例如 Model.scope('foo').findAll())的方式類似,關聯範圍是一個規則(更精確地說,是一組預設屬性和選項),它會自動套用於模型實例的呼叫。在這裡,「實例呼叫」指的是從實例(而不是從模型本身)呼叫的方法呼叫。Mixin 是實例方法的主要範例 (instance.getSomethinginstance.setSomethinginstance.addSomethinginstance.createSomething)。

關聯範圍的行為與模型範圍相同,因為兩者都會導致將類似 where 子句的東西自動套用於尋找器呼叫;不同之處在於,關聯範圍不是套用於靜態尋找器呼叫(模型範圍的情況),而是自動套用於實例尋找器呼叫(例如 mixins)。

範例

下面顯示模型 FooBar 之間一對多關聯的關聯範圍基本範例。

  • 設定

    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() mixin 時,關聯範圍 { 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。