sql >> Base de Datos >  >> RDS >> PostgreSQL

Obtenga un árbol de padres e hijos con pg-promise

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.