PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Holen Sie sich einen Eltern-Kind-Baum mit pg-promise

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.