私はpg-promiseの作者です。
テーブルが2つある場合: Parent
->子
1対多の関係で、一致する Parent
の配列を取得したい 行、各行はプロパティ children
で拡張されます テーブルChild
の対応する行の配列に設定します ...
一般にpg-promiseとpromisesの組み合わせは非常に柔軟であるため、これを実現するにはいくつかの方法があります。最短バージョンは次のとおりです:
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
に設定します。 そしてそれを返します。次に、メソッドbatchを使用して、 Child
の配列を解決します。 メソッドマップから返されたクエリ。
ES7の更新
これは上記と同じですが、ES7 async
を使用しています /待つコード> 構文:
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"}
]
}
]
APIリファレンス:マップ、バッチ
更新
これに対するより良い答えを参照してください:PostgreSQL/NodeJSを使用した結果の配列としてのJOINテーブル。