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.