2016-10-27 38 views
0

因此,我最終使得協會在我的續集代碼中工作。或者我想。由中間第三張表加上兩個關聯表

我有表A通過外鍵關聯到表B和表B關聯到表C.我想從A,B和C.使用過濾器行如果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

好的,這是可恥的。

我想通了。該符號將如下所示:

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 - 嵌套。

感謝這個來源http://lorenstewart.me/2016/09/12/sequelize-table-associations-joins/爲徹底和簡單的解釋。