Jsem autorem pg-promise.
Když máte 2 tabulky:Parent
-> Child
se vztahem 1-to-many a chcete získat pole odpovídajících Parent
řádky, každý řádek rozšířen o vlastnost children
nastavit na pole odpovídajících řádků z tabulky Child
...
Existuje několik způsobů, jak toho dosáhnout, protože kombinace pg-promise a slibů obecně je velmi flexibilní. Zde je nejkratší verze:
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 */
});
Toto tam děláme:
Nejprve se zeptáme na Parent
položky, pak každý řádek namapujeme na dotaz pro odpovídající Child
položky, které pak nastaví své řádky do Parent
a vrátí to. Potom použijeme metodu batch k vyřešení pole Child
dotazy vrácené z mapy metod.
AKTUALIZACE pro ES7
Zde je to stejné jako výše, ale pomocí ES7 async
/await
syntaxe:
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
Úloha se vyřeší pomocí pole, jako je toto:
[
{
"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"}
]
}
]
Reference API:mapa, dávka
AKTUALIZACE
Podívejte se na lepší odpověď:JOIN tabulku jako pole výsledků s PostgreSQL/NodeJS.