2016-05-20 3 views
0

У меня есть класс А, В и Сsequelize.js подряд многие ко многим

< - многие ко многим -> B и B < - многие многочастичными> C

Для одного A , Я хочу найти все C, связанные с A.

Как написать запрос продолжения так, чтобы он выполнял только один SQL-вызов?

многие ко многим уже определена в sequelize, например, я могу уже сделать a.getBs(), b.getCs(), или c.getBs()

Я мог бы, очевидно, просто написать,

a.getBs() 
.then(function(Bs) { 
    return foreach(Bs, function(b) {return b.getCs();}) 
}) 
.then(function() { 
    // flatten array of array of C here. 
}) 

Но это слишком много запросов SQL.

Кроме того, что, если у меня есть массив A? есть способ просто один SQL, чтобы вернуть карту {a1: [ "c1", "c2"], a2: [ "c2", "c99"] ...}

SELECT A.name, C.name as anotherName 
FROM A 
LEFT JOIN A_B ON A.id = A_B.A_id 
LEFT JOIN B ON A_B.B_id = B.id 
LEFT JOIN B_C ON B.id = B_C.B_id 
LEFT JOIN C ON C.id = B_C.C_id 
GROUP BY name, anotherName 

Я думаю, что это SQL, который мне нужен, а не уверен, как его генерировать из sequelize.

ответ

0

Sequelize присоединяется к ассоциации в основном с помощью включает в себя и жадная загрузка, так что ваш запрос должен выглядеть следующим образом:

A.findAll({ 
    where: { etc... } 
    include: [ 
    { 
     association: A.associations.B, 
     include: [ 
     B.associations.C 
     ] 
    } 
    ], 
}).then((results) => { 
    console.log(results[0].B[0].C[0]); 
}); 
Смежные вопросы