Join Sequelize.js:不关联的联接表

Join Sequelize.js:不关联的联接表,join,sequelize.js,Join,Sequelize.js,有没有一种方法可以连接没有使用sequelize中的include定义关联的表?这不是一个复制品。我所说的表根本没有关联,但有我想要连接的列 例如: 从银行选择* 左外联接帐户 on account.bank_name=bank.name 上述查询将返回表bank中的所有记录,而不管是否存在指定约束适用的帐户记录 在sequelize中,如果在account.bank\u name=bank.name上关联了模型bank和account,则这看起来类似于以下内容: bank.findAll({

有没有一种方法可以连接没有使用sequelize中的
include
定义关联的表?这不是一个复制品。我所说的表根本没有关联,但有我想要连接的列

例如:

从银行选择*
左外联接帐户
on account.bank_name=bank.name
上述查询将返回表
bank
中的所有记录,而不管是否存在指定约束适用的
帐户
记录

在sequelize中,如果在
account.bank\u name=bank.name
上关联了模型
bank
account
,则这看起来类似于以下内容:

bank.findAll({
包括:[{
型号:account,
必填项:false,
}]
})
但是,如果模型没有关联怎么办?是否有办法在部分或同等部分编写我自己的自定义

bank.findAll({
包括:[{
型号:account,
必填项:false,
关于:{
银行名称:Sequelize.col('bank.name')
}
}]
})

我模模糊糊地记得读过一些关于这个的东西,但我现在似乎在任何地方都找不到那个医生。如果您能指出文档中的正确部分,我们将不胜感激。

虽然可以在
条件下定义自定义的
,但如果不先定义,就不可能包含
关系。方法的文档措辞暗示了这一点(搜索
选项。包括第页的
):

使用左连接急切加载的关联列表。支持的是{include:[Model1,Model2,…]}或{include:[{model:Model1,as:'Alias'}]}或{include:['Alias']}。如果您的关联设置为as(例如X.hasMany(Y,{as:'Z}),则在加载Y时需要在as属性中指定Z)

选项上的文档。包括[]。
上的文档更简洁:

在加入的条件下提供您自己的


最后,我用Postgres视图解决了我的问题。也可以添加一个并绕过sequelize限制,但我只会用它作为开发/原型开发的工具,并在生产中提出一些更健壮/安全的东西,比如视图或存储过程。

对于任何在这里搜索的人:t这里有一个变通方法,不确定它当时是否可用,但从5.21.7开始,它就可以工作了。 您可以传递关联对象以包含参数:

const res = await bank.findAll({
        include: [
            {
                model: account,
                association: new HasMany(bank, account, {/*options*/}),
            },
        ],
    })
HasMany是一个关联构造函数,可以从Sequelize.Associations或Sequelize实例中获取。那里还有其他关联构造函数。对于TS,您需要手动强制转换,因为该属性不在类型中


UPD:对于belongTomany,您需要调用
\u injectAttributes()
关于关联之前的用法,除了HasMany之外,我没有检查其他人。

嗨,找到答案是否成功。实际上我也面临着类似的情况。同样。我似乎无法理解这样的事实,即可能会遗漏一些内容,但我们如何为子表构建子数组,因为我们会得到重复的结果@CoderX不确定“重复结果”的确切含义,是否要继续讨论(实际上,也不确定其工作原理)?我得到以下结果:
[{“userTime”:“14:00”,“id”:1,“name”:“Jack”,“Category.id”:11,“Category.name”:“Category1”,“Category.userID”:1},{“userTime”:“14:00”,“id”:1,“name”:“Jack”,“Category.id”:12,“Category.name”:“Category2”,“Category.userID”:1}]
但是我想显示如下结果:
[{“userTime”:“14:00”,“id”:1,“name”:“Jack”,Category1,userID:1},{id:12,name:“Category2”,userID:1}]
是的,这就是原始查询的问题所在;数据将以平面表的形式返回。您必须修改自己对JS对象的转换,或使查询/查看/存储过程返回json(b)与您期望的结构相匹配的值。这相当混乱;对于原型来说可以,但是对于生产来说,您需要一个与“更大的图景”相匹配的更好的解决方案“不管是什么项目,@AlexanderF。
我最终解决了问题,使用Postgres视图作为解决方法。
您是否能够在带有where子句的视图上使用findAndCountAll(筛选和分页)。如果是这样的话,你是否可以分享一些snnipet?我在两天内就尝试了,并且尝试了几乎所有的文档化方法。谢谢你的回答!你能提供一些到文档的链接吗(或一个简短的摘录)?我已经有一段时间没有处理Sequelize js了,所以你可能对现在的工作方式有了更好的了解。没有关于这方面的文档,我发现寻找Sequelize代码更简单更好。但是有一种更简单更好的方法,你可以定义关联,并通过使用
约束:false明确告诉Sequelize不要在db中创建关联在关联选项中。通过这种方式,您可以在代码中定义关联,而不是在数据库中定义关联,这样您就能够以常规方式编写
include
语句,让sequelize生成联接,但它不会在数据库中创建真正的外键。在v5中工作,不知道V6根据文档,
约束
应该执行以下操作如下:
应该在外键上启用更新时和删除时约束。
我设置了
约束:false
,并且能够使用
hasOne
关联来执行include,而不实际在数据库中创建外键。不过,文档中对
cons的用法有所不同列车