Sequelize是否可以处理与一个表关联的多个键?

时间:2018-07-24 15:17:20

标签: mysql node.js sequelize.js

假设我有一个名为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
;

1 个答案:

答案 0 :(得分:2)

如果您的意思是表1包含具有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)
}

如果表1中的字段超过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语法中似乎无法在同一表上进行联接,您将包括与要在其上调用find的表相同的表。这就是为什么Sequelize在这些特定情况下支持原始查询的原因...