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.