【问题标题】:Sequelize: How to query model by 1:n association, but include all associated objects in a single query (PostgreSQL)Sequelize:如何通过 1:n 关联查询模型,但在单个查询中包含所有关联对象(PostgreSQL)
【发布时间】:2018-11-22 10:35:01
【问题描述】:

我有一个与 Approval 模型(多级审批工作流)有关联的 Ticket 模型。批准属于用户。

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

已经解决了-

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

【问题讨论】:

    标签: javascript node.js postgresql sequelize.js


    【解决方案1】:

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

    更新 Ticket 以在 Approval 上拥有两个具有相同外键的关联(一个定义了别名)-

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

    【讨论】:

      【解决方案2】:

      这有点棘手,但是这样你可以在单个查询中获得结果,

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

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

      【讨论】:

      • 感谢您的回复,它确实有效。但是是否有可能以任何其他方式对 Ticket 作为基本模型进行查询?这里的用户 ID 被用作更大用例中的可选过滤器。
      • @Himavanth ,在这种情况下,您需要先获取票证的 id ,即 2 个查询,这样您就可以做到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多