为什么将Sequelize查询中OR运算符中的条件WHERE转换为AND?

时间:2019-04-07 21:56:53

标签: node.js sequelize.js

我正在尝试使用Sequelize使用条件WHERE进行查询,如此处所述(How to perform a search with conditional where parameters using Sequelize)。

我的代码的相关部分是这样的

    const Op = Sequelize.Op;
    var search = {};
     if (typeof req.query.search !== 'undefined'){
         search.nome = {[Op.like]: '%' + req.query.search + '%'};
         search.username = {[Op.like]: '%' + req.query.search + '%'};
    }
    model.User.findAll({
        where:{
         [Op.or]: [
           search
         ]
      })

它可以工作,但是生成的SQL会添加AND而不是OR,如下所示:

    SELECT 'id_', 'nome', 'username', 'id' FROM 'User' AS 'User' WHERE (('User'.'nome' LIKE '%test%' AND 'User'.'username' LIKE '%test%'))

我做错了什么我看不到吗? 我已经尝试过这种方法的几种组合,但都无效。

2 个答案:

答案 0 :(得分:0)

构造的search过滤器中有问题。 [Op.or]应该是搜索范围,而不是数组。

尝试如下,

model.User.findAll({
  where: {
    [Op.or]: {
      email: {
        [Op.like]: 'abcd',
      },
      username: {
        [Op.like]: 'cdf',
      },
    }
  },
  logging: console.log,
});

您将获得以下信息,

    SELECT "id", "name", "username" FROM "users" AS "User" WHERE "User"."deleted_at" IS NULL AND ("User"."email" LIKE 'abcd' OR "User"."username" LIKE 'cdf');

答案 1 :(得分:0)

尝试使用点差

model.User.findAll({
  where: {
    [Op.or]: [
      {...search}
    ]
  }
})

这是什么?

const where = {}
     if (typeof req.query.search !== 'undefined'){
       where[Op.or] = {
         nome : {
          [Op.like] : `%${req.query.search}%`
         },
         username : {
          [Op.like] : `%${req.query.search}%`
        },
       }
    }

    model.User.findAll({
      where
    })