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.