Sequelize:WHERE LIKE子句中的Concat字段

tri*_*e84 8 mysql node.js sequelize.js

我正在使用sequelize ORM来处理我正在研究的node.js项目.我有一个查询,我需要对多列的连接结果执行类似的操作.

例如,类似于以下内容:

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);
    });
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

cod*_*aff 18

你需要这样的东西

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

注意:未经测试

原始来源


yji*_*imk 13

受@ code-jaff的启发,但你需要在名字和姓氏之间连接一个空格字符串,以使其正常工作.否则它只会返回'JohnDoe'而不是'John Doe'.这是代码.

  Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
    like: '% John Doe %'
  })
Run Code Online (Sandbox Code Playgroud)

要为可能无法理解查询位置的人提供一些上下文,这是where或statement中上述代码的示例.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 + '%' } }
    ]
  }
})
Run Code Online (Sandbox Code Playgroud)

Sequelize 4.0的更新

基于字符串的运算符($like以及$or上面的示例)已被弃用,以支持基于符号的运算符.这对安全来说是件好事

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

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


Ian*_*amz 5

我能够根据 @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}%`},
  }
})
Run Code Online (Sandbox Code Playgroud)