Sequelize:WHERE LIKE 子句中的 Concat 字段

Sequelize: Concat fields in WHERE LIKE clause

我正在为我正在处理的 node.js 项目使用 sequelize ORM。我有一个查询,我需要对多列的串联结果执行类似的操作。

例如,如下所示:

SELECT * FROM People WHERE (CONCAT(firstname, ' ', lastname)) LIKE '%John Do%'.

我正在使用以下语法,想知道这是否可行而不必求助于使用 RAW 查询(我的解决方案中没有其他地方)。

   var criteria = {
        include: [
            occupation
        ],
        where: {
            is_active: 1
        },
        nest: false
    };

    db.people.findAll(criteria, {}).then(function(people) {
        success(people);
    }).catch(function(err) {
        error(err);
    });

有什么想法吗?

你需要这样的东西

var criteria = {
    where: Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstname"), Sequelize.col("lastname")), {
        like: '%John Do%'
    })
}

注意:未测试

Original source

受@code-jaff 启发,但您需要在名字和姓氏之间连接一个 space 字符串才能使其正常工作。否则它只会 return 用于 'JohnDoe' 而不是 'John Doe'。这是代码。

  Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
    like: '% John Doe %'
  })

为了向可能不了解这适合您的查询的人提供一些上下文,这是 where 或语句中上述代码的示例。 req.body.query 是您要发布的变量搜索词。

Users.findAll({
  where: {
    $or: [
      Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
        like: '%' + req.body.query + '%'
      }),
        { email: { $like: '%' + req.body.query + '%' } },
        { companyName: { $like: '%' + req.body.query + '%' } }
    ]
  }
})

Sequelize 4.0 更新

基于字符串的运算符(上例中的 $like$or)已被弃用,取而代之的是基于符号的运算符。这对安全来说是件好事

参见:http://docs.sequelizejs.com/manual/tutorial/querying.html#operators

这些运算符将替换为 [Sequelize.Op.like][Sequelize.Op.or]。还有其他方法可以在他们的文档中突出显示的续集选项中配置它

我能够使用基于@yjimk 回答的新续集版本 5.21.13 实现这一点。

Users.findAll({
  where: {
    [sequelize.Op.or]:{
     namesQuery: sequelize.where(
      sequelize.fn(
        "concat",
        sequelize.col("firstName"),
        " ",
        sequelize.col("lastName")
      ),
      {
        [sequelize.Op.like]: `%${req.body.query}%`,
      }
    ),
    email: {[sequelize.Op.like]: `%${req.body.query}%`},
    companyName: {[sequelize.Op.like]: `%${req.body.query}%`},
  }
})
db.models.users.findOne({ 
            where: {
                [db.sequelize.Op.and]: [
                    db.sequelize.where(
                        db.sequelize.fn('CONCAT', db.sequelize.col('first_name'), ' ', db.sequelize.col('last_name')), 
                        { like: `%${name}%` },
                    ),
                    { status: 'ACTIVE' },
                ]
            }
        });