sql >> Database >  >> RDS >> PostgreSQL

Krijg een ouder + kinderen boom met pg-promise

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.




  1. Een database-e-mailaccount bijwerken in SQL Server (T-SQL)

  2. MariaDB en externe gegevens

  3. Ontsnappen aan een enkel aanhalingsteken in PHP bij het invoegen in MySQL

  4. Een serverloze GraphQL-API maken voor MySQL, Postgres en Aurora