【问题标题】:Sequelize function on where续集功能在哪里
【发布时间】:2020-09-25 03:45:07
【问题描述】:

我在节点 12 上使用 sequelize 5.21.2。

我想变成这样:

SELECT `id`
FROM `order`
WHERE (substr(`order`.`code`,1,8) >= '20200101'
AND substr(`order`.`code`,1,8) <= '20201230')

所以我是这样写的:

return Model.order.findAll({
  attributes: [
    'id',
  ],
  where: {
    [sequelize.fn('substr', Model.sequelize.col('code'), 1, 8)]: {
      [Op.gte]: params.start_date,
      [Op.lte]: params.end_date,
    },
  },
});

但它会返回:

SELECT `order`.`id`
FROM `order`
WHERE (`order`.`[object Object]` >= '20200101'
AND `order`.`[object Object]` <= '20201230')

我试过了

[sequelize.literal('STR_TO_DATE(substr(code,1,8),\'%Y %m %d\')'), 'order_date']
[sequelize.literal('STR_TO_DATE(substr(code,1,8),\'%Y %m %d\')')]
[sequelize.fn('substr', Model.sequelize.col('code'), 1, 8)]

但是当我SELECT 时它们工作正常,但不是WHERE

如何获得我想要的结果?我在官方手册中找不到任何相关信息.. (https://sequelize.org/v5/manual/querying.html#where)

【问题讨论】:

    标签: node.js orm sequelize.js


    【解决方案1】:

    使用sequelize.whereOp.and 使用函数而不是列生成选择语句。请参阅 Sequelize 文档中的此页面 - Advanced queries with functions (not just columns)

    const { sequelize, order } = Model;
    return order.findAll({
      attributes: [
        'id',
      ],
      where: {
        [Op.and]: [
          sequelize.where(sequelize.fn('substr', sequelize.col('code'), 1, 8), {
            [Op.gte]: params.start_date,
          }),
          sequelize.where(sequelize.fn('substr', sequelize.col('code'), 1, 8), {
            [Op.lte]: params.end_date,
          }),
        ],
      },
    });
    

    【讨论】:

    • 第一个代码运行良好!但第二个是发生语法错误(SyntaxError: Unexpected token '.')...
    • @Centell - 谢谢我将删除答案的那部分。很确定只有第一个会起作用,但发现一些文件表明第二个会但是......不。 :)
    猜你喜欢
    • 2018-04-23
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多