Ini mudah dilakukan dengan pg-promise:
function buildTree(t) {
const v = q => t.any('SELECT id, value FROM votes WHERE question_id = $1', q.id)
.then(votes => {
q.votes = votes;
return q;
});
return t.map('SELECT * FROM questions', undefined, v).then(a => t.batch(a));
}
db.task(buildTree)
.then(data => {
console.log(data); // your data tree
})
.catch(error => {
console.log(error);
});
Sama seperti di atas, tetapi menggunakan ES7 async
/await
sintaks:
await db.task(async t => {
const questions = await t.any('SELECT * FROM questions');
for(const q of questions) {
q.votes = await t.any('SELECT id, value FROM votes WHERE question_id = $1', [q.id]);
}
return questions;
});
// method "task" resolves with the correct data tree
API:peta, apa saja, tugas, kumpulan
Pertanyaan terkait:
- Dapatkan pohon induk + anak dengan pg-promise
- Tugas bersyarat dengan pg-promise
Dan jika Anda ingin menggunakan hanya satu kueri, maka menggunakan sintaks PostgreSQL 9.4 dan yang lebih baru, Anda dapat melakukan hal berikut:
SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
(SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
FROM votes v WHERE q.id = v.question_id))
FROM questions q
Dan contoh pg-promise Anda adalah:
const query =
`SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
(SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
FROM votes v WHERE q.id = v.question_id)) json
FROM questions q`;
const data = await db.map(query, [], a => a.json);
Dan Anda pasti ingin menyimpan kueri kompleks seperti itu di file SQL eksternal. Lihat File Kueri.
Kesimpulan
Pilihan antara dua pendekatan yang disajikan di atas harus didasarkan pada persyaratan kinerja aplikasi Anda:
- Pendekatan kueri tunggal lebih cepat, tetapi agak sulit untuk dibaca atau diperluas, karena cukup bertele-tele
- Pendekatan multi-kueri lebih mudah dipahami dan diperluas, tetapi tidak bagus untuk kinerja, karena jumlah kueri yang dijalankan dinamis.
PERBARUI-1
Jawaban terkait berikut menawarkan lebih banyak opsi, dengan menggabungkan kueri turunan, yang akan memberikan kinerja yang jauh lebih baik:Gabungkan kueri loop bersarang ke hasil induk pg-promise.
PERBARUI-2
Contoh lain ditambahkan, menggunakan ES7 async
/await
pendekatan.