Sequelize: Как запросить модель по связи 1: n, но включить все связанные объекты в один запрос (PostgreSQL) - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть модель Ticket, имеющая отношение hasMany к модели Approval (многоуровневый рабочий процесс утверждения).Одобрение принадлежит Пользователю.

В конкретном случае использования мне придется отфильтровать все ожидающие подтверждения, которые будут сделаны Пользователем, и показать ему свои утвержденные Билеты.

Решеновот так -

models.Ticket.findAll({
  include: [{
            model: models.Approval,
            where: { userId: options.userId }
        }]
}).then(function(tickets){...

Дает мне отфильтрованные билеты, но я также должен получить список всех утверждений для билета, чтобы показать рабочий процесс утверждения.Можно ли это сделать одним запросом в Sequelize?

Data (T is Ticket, A is Approval and U is User) -

T1 - A1/U1, A2/U2, A3/U3
T2 - A4/U2
T3 - A5/U1, A6/U4

Output for U1 -

T1 - A1/U1
T3 - A5/U1

Expected for U1 -

T1 - A1/U1, A2/U2, A3/U3
T3 - A5/U1, A6/U4

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Найден обходной путь для его решения в одном запросе.

Обновите заявку, чтобы иметь две ассоциации при утверждении с одним и тем же внешним ключом (одна с определенным псевдонимом) -

Ticket.hasMany(models.Approval, {
  foreignKey: 'ticketId',
};
Ticket.hasMany(models.Approval, {
  as: 'ApprovalFilter',
  foreignKey: 'ticketId',
};

Затем отфильтруйте, используя несколько включений -

models.Ticket.findAll({
  include: [{
    model: models.Approval,
    as: 'ApprovalFilter',
    where: { userId: options.userId },
  }, {
    model: models.Approval,
  }]
}).then(function(tickets){...
0 голосов
/ 22 ноября 2018

Это довольно сложно , но таким образом вы можете достичь результата в одном запросе,

models.Approval.findAll({
    where: { userId: options.userId } // <---- Get all the approvals for user
    include: [{
            model: models.Ticket, // <----- Get all tickets for it
            include: [{
                model: models.Approval // <---- Get all the approvals for that ticket
            }]
    }]
})

ПРИМЕЧАНИЕ. Я не пробовал этогоодин, но, насколько я знаю, это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...