Ik ben de auteur van pg-promise.
Als je 2 tabellen hebt:Parent
-> Child
met een 1-op-veel-relatie, en u wilt een reeks overeenkomende Parent
rijen, elke rij uitgebreid met eigenschap children
ingesteld op een array van de overeenkomstige rijen uit tabel Child
...
Er zijn verschillende manieren om dit te bereiken, aangezien de combinatie van pg-promise en beloften in het algemeen zeer flexibel is. Hier is de kortste versie:
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 */
});
Dit is wat we daar doen:
Eerst vragen we naar Parent
items, dan koppelen we elke rij aan een zoekopdracht voor het corresponderende Child
items, die vervolgens de rijen instelt in de Parent
en geeft het terug. Vervolgens gebruiken we methode batch om de array van Child
. op te lossen query's geretourneerd uit de methodekaart.
UPDATE voor ES7
Hier is hetzelfde als hierboven, maar met ES7 async
/await
syntaxis:
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
De taak wordt opgelost met een array als deze:
[
{
"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-referenties:kaart, batch
UPDATE
Zie hier een beter antwoord op:JOIN-tabel als reeks resultaten met PostgreSQL/NodeJS.