通过中间第三表来查找两个关联表

时间:2016-10-27 17:26:39

标签: node.js associations sequelize.js model-associations

所以,我终于在我的续集代码中使用了协会。或者我想。

我将表A与表B相关联,表B通过外键与表C相关联。我想使用来自A,B和C的过滤器从A获取行。如果C不在图片中,我会做这样的事情:

 models.A.findOne({
            attributes: ['id', 'col1', 'col2'],
            where: {
                  col1: value1, 
                  col3: value3
            }, 
            include: [{model: models.B, required: true}]
        }).then(function (result) {
            res.send(result);
        }).catch(function(error){
            console.log(error);
            res.send(error);
        });    

请注意,col3是表B中的字段。

现在我想做的事情最好写成:

 models.A.findOne({
            attributes: ['id', 'col1', 'col2'],
            where: {
                  col1: value1, 
                  col3: value3,
                  col5: value5
            }, 
            include: [{model: models.B, required: true}, {model: models.C, required: true}]
        }).then(function (result) {
            res.send(result);
        }).catch(function(error){
            console.log(error);
            res.send(error);
        });   

Col5是表C的字段。

这样做(正确地)会给我一个错误: C未连接到A 。 我知道A连接到B,B连接到C,因为我在模型中定义了这些连接。但我无法定义甚至跨表关联 - 比如A和C.

首先,我不知道该怎么做,其次,关联可能包括最多5个表的链。当我说链时,我指的是一系列关联,而不是同一个表的并行关联。

sequelize如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

好的,那是可耻的。

我明白了。符号如下:

 models.A.findOne({
            attributes: ['id', 'col1', 'col2'],
            where: {
                  col1: value1, 
                  col3: value3,
                  col5: value5
            }, 
            include: [{model: models.B, required: true}, include:[{model: models.C, required: true}]]
        }).then(function (result) {
            res.send(result);
        }).catch(function(error){
            console.log(error);
            res.send(error);
        });  

基本上,嵌套关联的编写方式与sequ​​elize - nested中的类似。

感谢此来源http://lorenstewart.me/2016/09/12/sequelize-table-associations-joins/进行彻底而简单的解释。