Ich bin der Autor von pg-promise.
Wenn Sie 2 Tabellen haben:Parent
-> Child
mit einer 1-zu-viele-Beziehung, und Sie möchten ein Array passender Parent
erhalten Zeilen, jede Zeile erweitert mit der Eigenschaft children
auf ein Array der entsprechenden Zeilen aus der Tabelle Child
gesetzt ...
Es gibt mehrere Möglichkeiten, dies zu erreichen, da die Kombination von pg-promise und Promises im Allgemeinen sehr flexibel ist. Hier ist die kürzeste Version:
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 */
});
Das machen wir dort:
Zuerst fragen wir nach Parent
Elemente, dann ordnen wir jede Zeile einer Abfrage für das entsprechende Child
zu items, das dann seine Zeilen in den Parent
setzt und gibt es zurück. Dann verwenden wir die Methode batch, um das Array von Child
aufzulösen Abfragen, die von der Methodenzuordnung zurückgegeben werden.
UPDATE für ES7
Hier ist dasselbe wie oben, aber mit 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
Die Aufgabe wird mit einem Array wie diesem aufgelöst:
[
{
"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-Referenzen:map, batch
AKTUALISIEREN
Sehen Sie sich eine bessere Antwort darauf an:JOIN-Tabelle als Array von Ergebnissen mit PostgreSQL/NodeJS.