Аз съм автор на pg-promise.
Когато имате 2 таблици:Parent
-> Child
с връзка 1 към много и искате да получите масив от съвпадащи Parent
редове, всеки ред е разширен със свойство children
зададете на масив от съответните редове от таблица Child
...
Има няколко начина да постигнете това, тъй като комбинацията от pg-promise и обещания като цяло е много гъвкава. Ето най-кратката версия:
db.task(t => {
return t.map('SELECT * FROM Parent WHERE prop1 = $1', [prop1], parent => {
return t.any('SELECT * FROM Child WHERE parentId = $1', parent.id)
.then(children => {
parent.children = children;
return parent;
});
}).then(a => t.batch(a))
})
.then(data => {
/* data = the complete tree */
});
Ето какво правим там:
Първо, ние правим заявка за Parent
елементи, след което преобразуваме всеки ред в заявка за съответния Child
елементи, който след това задава своите редове в Parent
и го връща. След това използваме метод пакет, за да разрешим масива на Child
заявки, върнати от картата на методите.
АКТУАЛИЗИРАНЕ за ES7
Тук е същото като по-горе, но използвайки ES7 async
/await
синтаксис:
await db.task(async t => {
const parents = await t.any('SELECT * FROM Parent WHERE prop1 = $1', [prop1]);
for(const p of parents) {
p.children = await t.any('SELECT * FROM Child WHERE parentId = $1', [p.id]);
}
return parents;
});
// the task resolves with the correct data tree
Задачата ще бъде разрешена с масив като този:
[
{
"parent1-prop1", "parent1-prop2",
"children": [
{"child1-prop1", "child1-prop2"},
{"child2-prop1", "child2-prop2"}
]
},
{
"parent2-prop1", "parent2-prop2",
"children": [
{"child3-prop1", "child3-prop2"},
{"child4-prop1", "child4-prop2"}
]
}
]
Препратки към API:карта, партида
АКТУАЛИЗИРАНЕ
Вижте по-добър отговор на това:JOIN таблица като масив от резултати с PostgreSQL/NodeJS.