pg-promise — объединить несколько запросов вложенного цикла в результат родительского массива

Мой вопрос основан на Объединить запросы вложенных циклов к родительскому массиву результат - pg-promise. У меня аналогичный сценарий, но есть несколько запросов, которые нужно объединить, чтобы получить окончательные результаты. Ниже приведен мой код, с помощью которого я пытался реализовать свое требование. Но мне не удалось получить результаты второго запроса в сочетании с основным запросом. Я новичок и хотел бы знать правильный способ реализации.

  db.task(t => {
    const a = studies => t.any ('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id).then(facility_contacts => {
    studies.facility_contacts = facility_contacts;
    return studies
      });
    const b = studies => t.any ('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id).then(eligibilities => {
    studies.eligibilities = eligibilities;
    return studies;
      });
  return t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10',[], a, b).then(t.batch);
}).then(studies => {
  console.log(studies);
  res.send(studies);
}).catch(error => {
  console.log(error);
});

Заранее спасибо.


person Naveen George Thoppan    schedule 23.07.2018    source источник
comment
Вы должны опубликовать код того, что вы пробовали до сих пор, и объяснить, какая часть не работает. Просто попросить кого-нибудь написать ваш код для вас не очень хорошо в сообществе StackOverflow. Кроме того, заголовок вопроса не имеет смысла в этом контексте.   -  person vitaly-t    schedule 23.07.2018
comment
@vitaly-t Извините за неудобства. Я добавил свой код.   -  person Naveen George Thoppan    schedule 23.07.2018


Ответы (2)


Вот одна из возможностей:

db.task(t => {
    const a = studies => t.any('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id)
        .then(facility_contacts => {
            studies.facility_contacts = facility_contacts;
            return studies
        });
    const b = studies => t.any('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id)
        .then(eligibilities => {
            studies.eligibilities = eligibilities;
            return studies;
        });
    const c = studies => t.batch([a(studies), b(studies)]);
    return t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10', [], c)
        .then(t.batch);
})
    .then(studies => {
        console.log(studies);
        res.send(studies);
    })
    .catch(error => {
        console.log(error);
    });

Может быть много разных подходов, более эффективных, например, на основе JSON.

person vitaly-t    schedule 23.07.2018

Вы можете использовать Promise.all, чтобы получить все результаты

db.task(t => {
    const queries = [
        t.any('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id),
        t.any('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id),
        t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10', [], a, b)
    ];
    return Promise.all(queries);
}).then((ResultArrayOfQueries) => {
    console.log(ResultArrayOfQueries);
    // Combine as per your requirement
    res.send(ResultArrayOfQueries);
}).catch(error => {
    console.log(error);
});
person Rahul Sharma    schedule 23.07.2018
comment
Я получаю сообщение об ошибке, связанное со свойством Studies.nct_id - person Naveen George Thoppan; 23.07.2018
comment
Никогда не следует использовать Promise.all в контексте открытого соединения, как объясняет pg-promise: github.com/vitaly-t/pg-promise/wiki/ - person vitaly-t; 23.07.2018
comment
Кроме того, этот код даже не реализует никакой зависимости между данными запроса, что объясняется в вопросе. - person vitaly-t; 23.07.2018