Sequelize.js:连接没有关联的表

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中,如果模型bankaccount关联的话,它将类似于以下内容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 之外,我没有检查其他人。

  • 没有这方面的文档,我发现正在寻找续集代码。但还有更简单、更好的方法,您可以定义关联并明确告诉sequelize不要在关联选项中使用“constraints: false”在数据库中创建关联。https://sequelize.org/master/class/lib/model。 js~Model.html#static-method-belongs通过这种方式,您可以在代码中定义关联,而不是在数据库中定义关联,这样您就可以以常规方式编写“include”语句,让sequelize生成连接,但它不会创建数据库中的真实外键。v5 可以用,不知道 v6 怎么样 (4认同)
  • 根据文档,“constraints”应该执行以下操作:“应该在外键上启用更新和删除约束。”我设置了“constraints: false”,并且能够使用“hasOne”关联来执行包含无需在数据库中实际创建外键。尽管如此,文档对“constraints”的使用有不同的说法 (3认同)
  • 我只是想以答案为基础,因为我遇到了类似的要求。我不知道这是由于 TypeScript 还是续集版本 6 造成的,但我不得不使用 `this.hasMany(OtherModel, {/*options*/}` 而不是 `new HasMany(...)` (2认同)

Ale*_* F. 6

似乎虽然可以定义自定义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 视图作为解决方法解决了我的问题。也可以注入原始查询并绕过续集限制,但我只会将其用作开发/原型设计技巧,并在生产中提出更强大/更安全的东西;诸如视图或存储过程之类的东西。