sql >> Databáze >  >> RDS >> PostgreSQL

Získejte strom rodičů + dětí s pg-promise

Jsem autorem pg-promise.

Když máte 2 tabulky:Parent -> Child se vztahem 1-to-many a chcete získat pole odpovídajících Parent řádky, každý řádek rozšířen o vlastnost children nastavit na pole odpovídajících řádků z tabulky Child ...

Existuje několik způsobů, jak toho dosáhnout, protože kombinace pg-promise a slibů obecně je velmi flexibilní. Zde je nejkratší verze:

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 */
    });

Toto tam děláme:

Nejprve se zeptáme na Parent položky, pak každý řádek namapujeme na dotaz pro odpovídající Child položky, které pak nastaví své řádky do Parent a vrátí to. Potom použijeme metodu batch k vyřešení pole Child dotazy vrácené z mapy metod.

AKTUALIZACE pro ES7

Zde je to stejné jako výše, ale pomocí ES7 async /await syntaxe:

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

Úloha se vyřeší pomocí pole, jako je toto:

[
    {
        "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"}
        ]
    }    
]

Reference API:mapa, dávka

AKTUALIZACE

Podívejte se na lepší odpověď:JOIN tabulku jako pole výsledků s PostgreSQL/NodeJS.




  1. SQL Server Database Backup Encryption

  2. Vlastní SERIAL / automatický přírůstek na skupinu hodnot

  3. ORA-00903:neplatný název tabulky na PreparedStatement

  4. Jak funguje SQLite Rtrim()