मैं पीजी-वादा का लेखक हूं।
जब आपके पास 2 टेबल हों:Parent
-> Child
1-से-अनेक संबंध के साथ, और आप मिलान की एक सरणी प्राप्त करना चाहते हैं Parent
पंक्तियाँ, प्रत्येक पंक्ति संपत्ति के साथ विस्तारित होती है children
तालिका से संबंधित पंक्तियों की एक सरणी पर सेट करें Child
...
इसे पूरा करने के कई तरीके हैं, क्योंकि सामान्य तौर पर पीजी-वादा और वादों का संयोजन बहुत लचीला होता है। यहाँ सबसे छोटा संस्करण है:
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 */
});
हम वहां यही करते हैं:
सबसे पहले, हम Parent
. के लिए क्वेरी करते हैं आइटम, फिर हम प्रत्येक पंक्ति को संबंधित Child
. के लिए एक क्वेरी में मैप करते हैं आइटम, जो तब अपनी पंक्तियों को Parent
. में सेट करता है और उसे लौटा देता है। फिर हम Child
. की सरणी को हल करने के लिए मेथड बैच का उपयोग करते हैं विधि मानचित्र से लौटाए गए प्रश्न।
ES7 के लिए अद्यतन करें
यहाँ ऊपर जैसा ही है, लेकिन ES7 async
का उपयोग कर रहा है /await
वाक्य रचना:
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
कार्य इस तरह एक सरणी के साथ हल हो जाएगा:
[
{
"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"}
]
}
]
एपीआई संदर्भ:नक्शा, बैच
अपडेट करें
इसका एक बेहतर उत्तर देखें:PostgreSQL/NodeJS के साथ परिणामों की सरणी के रूप में तालिका में शामिल हों।