PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Obtenez un arbre parents + enfants avec pg-promise

Je suis l'auteur de pg-promise.

Lorsque vous avez 2 tables :Parent -> Child avec une relation 1-à-plusieurs, et vous voulez obtenir un tableau de correspondance Parent lignes, chaque ligne étant étendue avec la propriété children défini sur un tableau des lignes correspondantes de la table Child ...

Il existe plusieurs façons d'y parvenir, car la combinaison de pg-promise et de promesses en général est très flexible. Voici la version la plus courte :

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

Voici ce que nous faisons ici :

Tout d'abord, nous interrogeons Parent items, puis nous mappons chaque ligne dans une requête pour le Child correspondant éléments, qui définit ensuite ses lignes dans le Parent et le retourne. Ensuite, nous utilisons la méthode batch pour résoudre le tableau de Child requêtes renvoyées par method map.

MISE À JOUR pour ES7

Voici la même chose que ci-dessus, mais en utilisant 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

La tâche se résoudra avec un tableau comme celui-ci :

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

Références API :map, batch

MISE À JOUR

Voir une meilleure réponse à ceci :table JOIN en tant que tableau de résultats avec PostgreSQL/NodeJS.