Jag är författaren till pg-promise.
När du har 2 tabeller:Parent
-> Child
med 1-till-många-relation och du vill få en mängd matchande Parent
rader, varje rad utökad med egenskapen children
inställd på en matris med motsvarande rader från tabellen Child
...
Det finns flera sätt att åstadkomma detta, eftersom kombinationen av pg-löfte och löften i allmänhet är väldigt flexibel. Här är den kortaste versionen:
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 */
});
Det här är vad vi gör där:
Först frågar vi efter Parent
objekt, sedan mappar vi varje rad till en fråga för motsvarande Child
objekt, som sedan ställer in sina rader i Parent
och returnerar den. Sedan använder vi metodbatch för att lösa arrayen av Child
frågor som returneras från metodkartan.
UPPDATERING för ES7
Här är samma som ovan, men med ES7 async
/await
syntax:
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
Uppgiften kommer att lösas med en array så här:
[
{
"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-referenser:karta, batch
UPPDATERA
Se ett bättre svar på detta:JOIN-tabell som en rad resultat med PostgreSQL/NodeJS.