關聯範圍
本節討論關聯範圍,它與模型範圍類似,但並不相同。
關聯範圍可以放置在關聯的模型(關聯的目標)上,也可以放置在多對多關係的中介表上。
概念
與模型範圍自動套用於模型靜態呼叫(例如 Model.scope('foo').findAll()
)的方式類似,關聯範圍是一個規則(更精確地說,是一組預設屬性和選項),它會自動套用於模型實例的呼叫。在這裡,「實例呼叫」指的是從實例(而不是從模型本身)呼叫的方法呼叫。Mixin 是實例方法的主要範例 (instance.getSomething
、instance.setSomething
、instance.addSomething
和 instance.createSomething
)。
關聯範圍的行為與模型範圍相同,因為兩者都會導致將類似 where
子句的東西自動套用於尋找器呼叫;不同之處在於,關聯範圍不是套用於靜態尋找器呼叫(模型範圍的情況),而是自動套用於實例尋找器呼叫(例如 mixins)。
範例
下面顯示模型 Foo
和 Bar
之間一對多關聯的關聯範圍基本範例。
-
設定
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()
會產生以下 SQLSELECT
`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。