Jestem autorem pg-promise.
Gdy masz 2 tabele:Parent
-> Child
z relacją 1-do-wielu i chcesz uzyskać tablicę pasujących Parent
wiersze, każdy wiersz rozszerzony o właściwość children
ustaw na tablicę odpowiednich wierszy z tabeli Child
...
Istnieje kilka sposobów, aby to osiągnąć, ponieważ połączenie obietnicy pg i obietnic w ogóle jest bardzo elastyczne. Oto najkrótsza wersja:
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 */
});
Oto, co tam robimy:
Najpierw pytamy o Parent
elementów, następnie mapujemy każdy wiersz na zapytanie dla odpowiedniego Child
elementów, który następnie ustawia swoje wiersze w Parent
i zwraca go. Następnie używamy metody wsadowej do rozwiązania tablicy Child
zapytania zwrócone z mapy metod.
AKTUALIZACJA dla ES7
Oto to samo, co powyżej, ale przy użyciu ES7 async
/await
składnia:
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
Zadanie zostanie rozwiązane za pomocą tablicy w następujący sposób:
[
{
"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"}
]
}
]
Referencje API:mapa, wsad
AKTUALIZUJ
Zobacz lepszą odpowiedź:tabela JOIN jako tablica wyników z PostgreSQL/NodeJS.