【问题标题】:Possible to WHERE on nested includes in Sequelize?可以在 Sequelize 中嵌套包含的 WHERE 上吗?
【发布时间】:2019-11-04 00:06:23
【问题描述】:

我遇到了一个问题,我一直坚持,但无济于事 - 在本质上与 Where condition for joined table in Sequelize ORM 相似,除了我想查询以前的连接。也许代码会解释我的问题。很高兴提供任何额外的信息。

型号:

A.hasMany(B);
B.belongsTo(A);
B.hasMany(C);
C.belongsTo(B);

这是我希望通过 Sequelize 实现的目标:

SELECT *
FROM `A`AS `A`
LEFT OUTER JOIN `B` AS `B` ON `A`.`id` = `B`.`a_id`
LEFT OUTER JOIN `C` AS `B->C` ON `B`.`id` = `B->C`.`b_id`
    AND (`B`.`b_columnName` = `B->C`.`c_columnName`);

这就是我想象的工作方式: (相反,它将创建一个原始查询(2 个原始查询,用于 AB/C),在连接时使用 AND ( `C`.`columnName` = '$B.columnName$'))(第二个参数是一个字符串)。尝试过sequelize.colsequelize.where(sequelize.col...等。)

A.findOne({
    where: { id: myId },
    include: [{
        model: B,
        include: [{
            model: C,
            where: { $C.c_columnName$: $B.b_columnName$ }
        }]
    }]
});

【问题讨论】:

    标签: javascript sql orm sequelize.js


    【解决方案1】:

    使用Op.col 查询运算符查找与查询中的其他列匹配的列。如果你只加入一个表,你可以传递一个对象而不是一个数组,以使其更简洁。

    const Op = Sequelize.Op;
    
    const result = await A.findOne({
      include: {
        model: B,
        include: {
          model: C,
          where: {
            c_columnName: {
              [Op.col]: 'B.b_columnName',
            },
          }
        },
      },
    });
    

    【讨论】:

    • 谢谢!这完美地工作。编辑:对于将来阅读本文的任何人,请注意在包含上使用 limit 可能会破坏:github.com/sequelize/sequelize/issues/9869
    • 非常感谢我花了大约 5 小时才找到这个解决方案 :)
    猜你喜欢
    • 2017-08-27
    • 2021-02-09
    • 1970-01-01
    • 2019-04-11
    • 2021-05-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多