Ale*_* F. 11 join sequelize.js
有没有办法连接没有include在sequelize 中定义的关联的表?这不是重复这个.我说的是根本没有关联但有我要加入的列的表.
例:
select * from bank
left outer join account
on account.bank_name = bank.name
Run Code Online (Sandbox Code Playgroud)
bank无论是否存在account指定约束条件的记录,上述查询都将返回表中的所有记录.
在sequelize中,如果模型bank和account关联的话,它将类似于以下内容account.bank_name = bank.name:
bank.findAll({
include: [{
model: account,
required: false,
}]
})
Run Code Online (Sandbox Code Playgroud)
但是,如果模型没有关联怎么办?有没有办法编写我自己的自定义on部分或等效的:
bank.findAll({
include: [{
model: account,
required: false,
on: {
bank_name: Sequelize.col('bank.name')
}
}]
})
Run Code Online (Sandbox Code Playgroud)
我依稀记得读过一些关于此的内容,但我现在似乎无法在任何地方找到该文档.如果您可以指向文档中的正确部分,将不胜感激.
Kar*_*bur 14
对于最终在这里谷歌搜索的人:有一个解决方法,不确定当时是否可用,但从 5.21.7 开始它可以工作。您可以传递关联对象以包含参数:
const res = await bank.findAll({
include: [
{
model: account,
association: new HasMany(bank, account, {/*options*/}),
},
],
})
Run Code Online (Sandbox Code Playgroud)
HasMany是一个关联构造函数,可以从Sequelize.Associations或sequelize实例中获取。那里还有其他关联构造函数。对于 TS,您需要手动转换,因为该属性不在类型中。
UPD:对于BelongsToMany,您需要调用_injectAttributes()关联之前的使用情况,除了HasMany 之外,我没有检查其他人。
似乎虽然可以定义自定义on条件,但如果不先include定义关联,就不可能建立关系。findAll方法的文档措辞暗示了这一点(options.include在页面上搜索):
使用左连接急切加载的关联列表。支持的是 { include: [ Model1, Model2, ...]} 或 { include: [{ model: Model1, as: 'Alias' }]} 或 { include: ['Alias']}。如果您的关联设置为 as(例如,X.hasMany(Y, { as: 'Z },您需要在预加载 Y 时在 as 属性中指定 Z)。
上的文档options.include[].on更加简洁:
为加入提供您自己的 ON 条件。
我最终使用 Postgres 视图作为解决方法解决了我的问题。也可以注入原始查询并绕过续集限制,但我只会将其用作开发/原型设计技巧,并在生产中提出更强大/更安全的东西;诸如视图或存储过程之类的东西。
| 归档时间: |
|
| 查看次数: |
4006 次 |
| 最近记录: |