【问题标题】:Sequelize Scope equivalentSequelize Scope 等效项
【发布时间】:2019-08-25 00:25:48
【问题描述】:

我想删除日期晚于今天 - 7 并且状态类似于“已取消”的行。

如何为该原始查询创建等效的 Sequelize 范围:

SELECT `st_shipment_header`.`id`, 
 FROM `st_shipment_header` AS `st_shipment_header` 
 LEFT OUTER JOIN `st_shipment_event` AS `st_shipment_events` ON `st_shipment_header`.`id` = `st_shipment_events`.`stShipmentHeaderId`
 WHERE (`st_shipment_header`.`id` 
 NOT IN 
 ( SELECT `st_shipment_header`.`id` FROM `st_shipment_header` AS `st_shipment_header` 
 LEFT OUTER JOIN `st_shipment_event` AS `st_shipment_events` ON `st_shipment_header`.`id` = `st_shipment_events`.`stShipmentHeaderId` 
 WHERE (`st_shipment_events`.`date` < NOW() - INTERVAL 7 DAY ) AND (`st_shipment_header`.`shipmentStatus` LIKE 'Canceled%'))));

我已经尝试将这个作为 Sequelize 范围:

StShipmentHeader.addScope('test', {
  include: [
    { model: models.st_shipment_event }
  ],
  where: {
    [Op.notIn]: {
      [Op.and]: {
        'models.st_shipment_event.date': {
          [Op.lt]: new Date().setDate(new Date().getDate() - 7)
        },
        shipmentStatus: {
          [Op.like]: '%Canceled%'
        }
      }
    }
  }
})

但看起来[Op.notIn] 不起作用...

【问题讨论】:

  • 是因为scope 没有注册还是仅仅因为查询没有按预期工作?添加生成的 SQL 会更好。

标签: mysql sql node.js sequelize.js


【解决方案1】:

我最终通过在没有NOT IN 的情况下创建不同的 SQL 查询来解决它。

    SELECT 
        `st_shipment_header`.`id`
    FROM
        `st_shipment_header`
            LEFT OUTER JOIN
        `st_shipment_event` AS `st_shipment_events` ON `st_shipment_header`.`id` = `st_shipment_events`.`stShipmentHeaderId`
    WHERE
        ((`st_shipment_header`.`shipmentStatus` LIKE 'Canceled%'
            AND `st_shipment_events`.`date` > NOW() - INTERVAL 7 DAY)
            OR `st_shipment_header`.`shipmentStatus` NOT LIKE 'Canceled%');

    StShipmentHeader.addScope('test', {
      include: [
        models.st_shipment_event,
      ],
      where: {
        [Op.and]: {
          [Op.or]: {
            shipmentStatus: {
              [Op.notLike]: 'Canceled%'
            },
            [Op.and]: {
              shipmentStatus: {
                [Op.like]: 'Canceled%'
              },
              'models.st_shipment_event': sequelize.where(
                sequelize.col('st_shipment_events.date'),
                {
                  [Op.gt]: sequelize.literal('NOW() - INTERVAL 7 DAY')
                }
              )
            }
          },
        }
      }
    })

主要变化:

  • 使用sequelize.col标识列,
  • 使用sequelize.literal('NOW() - INTERVAL 7 DAY')
  • 使用不同的 SQL 查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2023-03-07
    • 2011-08-19
    • 1970-01-01
    • 2010-10-20
    • 2022-01-17
    相关资源
    最近更新 更多