Soy el autor de pg-promise.
Cuando tienes 2 tablas:Parent
-> Child
con una relación de 1 a muchos, y desea obtener una matriz de coincidencias Parent
filas, cada fila extendida con la propiedad children
establecido en una matriz de las filas correspondientes de la tabla Child
...
Hay varias formas de lograr esto, ya que la combinación de pg-promise y las promesas en general es muy flexible. Aquí está la versión más corta:
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 */
});
Esto es lo que hacemos allí:
Primero, consultamos por Parent
elementos, luego mapeamos cada fila en una consulta para el Child
correspondiente elementos, que luego establece sus filas en el Parent
y lo devuelve. Luego usamos el método por lotes para resolver la matriz de Child
consultas devueltas desde el mapa de métodos.
ACTUALIZACIÓN para ES7
Aquí está lo mismo que arriba, pero usando ES7 async
/await
sintaxis:
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 tarea se resolverá con una matriz como esta:
[
{
"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"}
]
}
]
Referencias API:mapa, lote
ACTUALIZAR
Vea una mejor respuesta a esto:tabla JOIN como matriz de resultados con PostgreSQL/NodeJS.