2016-10-27 2 views
0

Итак, я, наконец, создал ассоциации в моем кодексе продолжения. Или так я думал.Обобщить две ассоциированные таблицы промежуточной третьей таблицей

У меня есть таблица A, связанная с таблицей B и таблицей B, связанной с таблицей 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 является полем в таблице В.

Теперь то, что я хочу сделать, в идеале было бы записать так:

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 не подключен до A. Я знаю, что A подключен к B и B к C, потому что я определяю эти соединения в моделях. Но я не могу определить даже ассоциации между таблицами - например, A и C.

Во-первых, я не знаю, как это сделать, а во-вторых, ассоциации могут включать в себя цепочки до 5 таблиц. Когда я говорю о цепях, я имею в виду ряд ассоциаций, а не параллельные ассоциации с одной и той же таблицей.

Как справиться с этим сценарием?

ответ

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-inested.

Благодаря этому источнику http://lorenstewart.me/2016/09/12/sequelize-table-associations-joins/ для подробного и простого объяснения.

Смежные вопросы