Tôi là tác giả của pg-promise.
Khi bạn có 2 bảng:Parent
-> Child
với mối quan hệ 1-nhiều và bạn muốn nhận một mảng Parent
phù hợp các hàng, mỗi hàng được mở rộng bằng thuộc tính children
đặt thành một mảng các hàng tương ứng từ bảng Child
...
Có một số cách để thực hiện điều này, vì sự kết hợp giữa pg-promise và Promise nói chung là rất linh hoạt. Đây là phiên bản ngắn nhất:
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 */
});
Đây là những gì chúng tôi làm ở đó:
Đầu tiên, chúng tôi truy vấn Parent
các mục, sau đó chúng tôi ánh xạ từng hàng thành một truy vấn cho Child
tương ứng các mục, sau đó đặt các hàng của nó thành Parent
và trả lại nó. Sau đó, chúng tôi sử dụng lô phương pháp để giải quyết mảng Child
các truy vấn được trả về từ bản đồ phương pháp.
CẬP NHẬT cho ES7
Đây cũng giống như trên, nhưng sử dụng ES7 async
/ await
cú pháp:
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
Nhiệm vụ sẽ giải quyết bằng một mảng như thế này:
[
{
"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"}
]
}
]
Tham chiếu API:bản đồ, lô
CẬP NHẬT
Xem câu trả lời hay hơn cho vấn đề này:Tham gia bảng dưới dạng mảng kết quả với PostgreSQL / NodeJS.