【问题标题】:Can Sequelize handle multiple keys that is associated with one table?Sequelize 可以处理与一张表关联的多个键吗?
【发布时间】:2018-07-25 17:39:17
【问题描述】:

假设我有一个名为 Table1 的表。一个业务表关联了 3 个业务 ID。

Table1
---------
idBusiness1, idBusiness2, idBusiness3, etc.

Business
---------
idBusiness, Name

有没有办法关联上面的两个表来创建一个 Sequelize 查询(除了原始查询)来拉回所有 3 个企业的名称?

SQL 如下所示:

SELECT 
    t1.id, B1.Name AS 'Business1', B2.Name AS 'Business2'
FROM
    Table1 t1
        LEFT OUTER JOIN
    Business b1 ON idBusiness1 = b1.idBusiness
        LEFT OUTER JOIN
    Business b2 ON idBusiness2 = b2.idBusiness
;

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    如果您的意思是 Table1 包含具有 idBusiness1、idBusiness2、idBusiness3、... 值的字段 idBusiness,那么您希望以 SQL 格式实现的是

    db.seq.query('
    SELECT * FROM Business 
    INNER JOIN Table1 ON Table1.idBusiness = Business.idBusiness ').success(function(rows) {
        res.json(rows);
    });
    

    使用 ORM 格式,您将使用带有 include 参数的预加载:

    Table1.findAll({
        include: [{
            model: Business,
            required: true
        }]
    }).then(results => {
         /* ... */
    }.);
    

    如果您的意思是您有 3 个不同的字段,并且想要获得 id 至少等于其中一个的业务名称:

    SELECT * from Business
    INNER JOIN Table1 ON Business.idBusiness IN (Table1.idBusiness1, Table1.idBusiness2, Table1.idBusiness3)
    

    在ORM格式中我能想到的最简单的方法是

    Business.findAll({
        where: { id: list }
    }
    

    您将从 findAll 查询中获取 Table1 中的所有 id,并将结果转换为所有这些 id 的数组。我猜 Table1.findAll{} 的结果将是格式

     [{idBusiness1: 1, idBusiness2: 2, idBusiness3: 3}, {idBusiness1: 42, idBusiness2: 32, idBusiness: 70}]
    

    因此,只需一点代码,您就可以遍历此列表以形成另一个

    finalList = [];
    list.forEach((item) => {
        finalList.push(item.idBusiness1)
        finalList.push(item.idBusiness2)
        finalList.push(item.idBusiness3)
    }
    

    如果 Table1 中有超过 3 个字段,则可以遍历 Javascript 对象的属性以概括这 3 个推送。如果是这种情况,请告诉我,您需要帮助。

    更新:

    自从 OP 澄清后,在查询中设置 required:false 会将内连接变成左(外)连接。

    当您添加 where 选项时,它会自动将 required 设置为 true,这会将连接变为内部连接。请参阅http://docs.sequelizejs.com/class/lib/model.js~Model.html#findalloptions-promisearrayinstance 处的参数options.include[].where 的描述。

    在 Sequelize 语法中似乎不可能加入同一个表,您将包含与您调用查找的表相同的表。这就是为什么 Sequelize 在这些特定情况下支持原始查询......

    【讨论】:

    • 我也更新了我的答案,不幸的是,它似乎无法加入您以 sequelize 语法查询的同一个表。原始查询看起来像是要走的路
    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 2017-10-27
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多