PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zdobądź drzewo rodziców + dzieci z pg-obietnicą

Jestem autorem pg-promise.

Gdy masz 2 tabele:Parent -> Child z relacją 1-do-wielu i chcesz uzyskać tablicę pasujących Parent wiersze, każdy wiersz rozszerzony o właściwość children ustaw na tablicę odpowiednich wierszy z tabeli Child ...

Istnieje kilka sposobów, aby to osiągnąć, ponieważ połączenie obietnicy pg i obietnic w ogóle jest bardzo elastyczne. Oto najkrótsza wersja:

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

Oto, co tam robimy:

Najpierw pytamy o Parent elementów, następnie mapujemy każdy wiersz na zapytanie dla odpowiedniego Child elementów, który następnie ustawia swoje wiersze w Parent i zwraca go. Następnie używamy metody wsadowej do rozwiązania tablicy Child zapytania zwrócone z mapy metod.

AKTUALIZACJA dla ES7

Oto to samo, co powyżej, ale przy użyciu ES7 async /await składnia:

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

Zadanie zostanie rozwiązane za pomocą tablicy w następujący sposób:

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

Referencje API:mapa, wsad

AKTUALIZUJ

Zobacz lepszą odpowiedź:tabela JOIN jako tablica wyników z PostgreSQL/NodeJS.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TypeError:obiekt „int” nie obsługuje indeksowania

  2. Instrukcja IF PostgreSQL

  3. Jak tworzyć i usuwać bazy danych i tabele w PostgreSQL

  4. Przycinaj końcowe spacje za pomocą PostgreSQL

  5. Jak dodać źródło danych PostgreSQL do WildFly 9.0?