Erhalte einen Eltern + Kinder Baum mit pg-Versprechen

Ich verwende daspg-promise Bibliothek mitbluebird für abhängige Abfragen. Ich habe zwei Tabellen, a und b, die so aussehen:

|   a   |     |   b   |  
|-------|     |-------|
| a_id  |     | b_id  |
| prop1 |     | prop2 |
              |  b_a  |

wob.b_a ist ein Verweis aufa.a_id. Ich möchte alle Einträge auswählen, die mit einem bestimmten @ übereinstimmeprop1 und das Ergebnis sollte alle passenden @ enthalta -Zeilen plus das entsprechendeb -Zeilen für jedesa. Dies sollte mit zwei abhängigen Abfragen möglich sein. Beide Abfragen geben möglicherweise mehrere Ergebnisse zurück.

Wenn Tabellea gibt nur eine Zeile zurück Ich kann das tun:

function getResult(prop1) {
    return db.task(function (t) {
        return t.one("select * from a where prop1=$1", prop1)
            .then(function (a) {
                return t.batch([a, t.any("select * from b where b_a=$1", a.a_id)]);
            })
            .then(function (data) {
                var a = data[0];
                var bs = data[1];
                bs.forEach(function (b) {
                    b.a = a;
                });
                return bs;
            });
    });
}

Und ich kann auch alle passenden @ bekommb -Einträge für mehrerea -Ergebnisse wie folgt:

function getResult(prop1) {
    return db.task(function (t) {
        return t.many("select * from a where prop1=$1", prop1)
            .then(function (as) {
                var queries = [];
                as.forEach(function (a) {
                    queries.push(t.any("select * from b where b_a=$1", a.id));
                });
                return t.batch(queries); // could concat queries with as here, but there wouldn't be a reference which b row belongs to which a row
            })
            .then(function (data) {
                // data[n] contains all matching b rows
            });
    });
}

Aber wie bringt man diese beiden zusammen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage