PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Dapatkan pohon orang tua + anak dengan pg-promise

Saya penulis pg-promise.

Saat Anda memiliki 2 tabel:Parent -> Child dengan hubungan 1-ke-banyak, dan Anda ingin mendapatkan larik Parent . yang cocok baris, setiap baris diperpanjang dengan properti children set ke array dari baris yang sesuai dari tabel Child ...

Ada beberapa cara untuk mencapai ini, karena kombinasi pg-promise dan janji secara umum sangat fleksibel. Ini versi terpendeknya:

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

Inilah yang kami lakukan di sana:

Pertama, kami meminta Parent item, lalu kami memetakan setiap baris ke dalam kueri untuk Child . yang sesuai item, yang kemudian menyetel barisnya ke dalam Parent dan mengembalikannya. Kemudian kami menggunakan metode batch untuk menyelesaikan array Child kueri yang dikembalikan dari peta metode.

PERBARUI untuk ES7

Ini sama seperti di atas, tetapi menggunakan ES7 async /await sintaks:

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

Tugas akan diselesaikan dengan larik seperti ini:

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

Referensi API:peta, kumpulan

PERBARUI

Lihat jawaban yang lebih baik untuk ini:GABUNG tabel sebagai larik hasil dengan 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. Bisakah saya meminta Postgresql untuk mengabaikan kesalahan dalam transaksi?

  2. Bidang gabungan CTE rekursif dengan orang tua dari titik sewenang-wenang

  3. Cara Membuat Tampilan di PostgreSQL

  4. Fungsi Buat PostgreSQL

  5. Batasan yang ditentukan DEFERRABLE AWAL SEGERA masih DEFERRED?