两个嵌套关联的续订顺序

时间:2017-11-13 16:58:58

标签: postgresql sql-order-by sequelize.js

我尝试将order用于我的子查询。但是sequelize会生成一个错误的查询,并在主查询中使用此order by 这是我的疑问:

Model.findAll({
order: sequelize.literal('("asset->forOrder"."value" - "asset.currenthours") desc),
offset: 0,
limit: 10,
include: [{
  model: Asset,
  as: 'asset',
  include: [{
    model: ThresholdService,
    required: false,
    as: 'thresholdservices'
  }, {
    model: ThresholdService,
    where: {property: 'hours'},
    required: false,
    duplicating: false,
    as: 'forOrder'
  }],
}]
})


我希望得到这样的查询:

SELECT ..., "asset->forOrder"."asset_id", "asset->forOrder"."value"
                 FROM (
                        SELECT ...
                        FROM "machineidentity" AS "machineidentity" 
                        LIMIT 10 OFFSET 0
                      ) AS "machineidentity"
                   LEFT OUTER JOIN "asset" AS "asset" ON "machineidentity"."unique_id" = "asset"."machineIdentityId"
                   LEFT OUTER JOIN "thresholdservice" AS "asset->thresholdservices" ON "asset"."id" = "asset->thresholdservices"."asset_id"
                   LEFT OUTER JOIN "thresholdservice" AS "asset->forOrder" ON "asset"."id" = "asset->forOrder"."asset_id" AND "asset->forOrder"."property" = 'hours' 
ORDER BY ("asset->forOrder"."value" - "asset"."currenthours") DESC;

但有:

SELECT ..., "asset->forOrder"."asset_id", "asset->forOrder"."value"
                 FROM (
                        SELECT ...
                        FROM "machineidentity" AS "machineidentity"
                        ORDER BY ("asset->forOrder"."value" - "asset"."currenthours") DESC
                        LIMIT 10 OFFSET 0
                      ) AS "machineidentity"
                   LEFT OUTER JOIN "asset" AS "asset" ON "machineidentity"."unique_id" = "asset"."machineIdentityId"
                   LEFT OUTER JOIN "thresholdservice" AS "asset->thresholdservices" ON "asset"."id" = "asset->thresholdservices"."asset_id"
                   LEFT OUTER JOIN "thresholdservice" AS "asset->forOrder" ON "asset"."id" = "asset->forOrder"."asset_id" AND "asset->forOrder"."property" = 'hours'
ORDER BY ("asset->forOrder"."value" - "asset"."currenthours") DESC;

ORDER BY出现在machineidentity查询中。

1 个答案:

答案 0 :(得分:0)

我在sequelize找到了这样的代码:

if (
      subQuery
      && Array.isArray(order)
      && order[0]
      && !(order[0] instanceof Association)
      && !(typeof order[0] === 'function' && order[0].prototype instanceof Model)
      && !(typeof order[0].model === 'function' && order[0].model.prototype instanceof Model)
      && !(typeof order[0] === 'string' && model && model.associations !== undefined && model.associations[order[0]])
    ) {
      subQueryOrder.push(this.quote(order, model, '->'));
    }
    mainQueryOrder.push(this.quote(order, model, '->'));

我刚创建order,但不满足此if。 所以,现在我的order看起来像是:

[['asset.forOrder', 'value', sequelize.literal('-(machine.asset.currentkilometers - machine.asset.initialvalueinkm)')]]