扫码一下
查看教程更方便
本节涉及关联作用域,它们与模型作用域类似但不相同。
关联作用域既可以放在关联的模型(关联的目标)上,也可以放在多对多关系的联结表中。
与模型作用域如何自动应用于模型静态调用(例如 model.scope('foo').findall()
)类似,关联作用域也是一个规则(更确切地说, 一组默认属性和参数),这些属性会自动应用于模型中的实例调用。 这里,实例调用是指从实例(而不是从 model 本身)调用的方法调用。 mixins 是实例方法的主要示例(instance.getsomething, instance.setsomething, instance.addsomething 和 instance.createsomething)。
关联作用域的行为就像模型作用域一样,在某种意义上,两者都导致将诸如 where 子句之类的内容自动应用到查找器调用; 区别在于,关联作用域不是自动应用于静态finder调用(模型范围就是这种情况),而是自动应用于实例finder调用(例如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()
会生成以下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。