所以,我终于在我的续集代码中使用了协会。或者我想。
我将表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如何处理这种情况?
答案 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);
});
基本上,嵌套关联的编写方式与sequelize - nested中的类似。
感谢此来源http://lorenstewart.me/2016/09/12/sequelize-table-associations-joins/进行彻底而简单的解释。