序列化:如何通过1:n关联查询模型,但在单个查询(PostgreSQL)中包括所有关联的对象

时间:2018-11-22 10:35:02

标签: javascript node.js postgresql sequelize.js

我有一个票证模型,该模型具有hasMany与批准模型(多级批准工作流)的关系。批准属于用户。

对于特定的用例,我必须过滤用户要进行的所有待处理的批准,并向他展示他的待批准票证。

已经解决了-

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 :(得分:0)

这有点棘手,但是通过这种方式,您可以在单个查询中获得结果,

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
            }]
    }]
})
  

注意:我还没有尝试过,但是只要我知道这应该   工作。

答案 1 :(得分:0)

找到了一种解决方法,可以在一个查询中解决该问题。

将票证更新为具有两个具有相同外键的批准关联(一个已定义别名)-

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){...