Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Sequelize:WHERE-LIKE子句中的Concat字段_Mysql_Node.js_Sequelize.js - Fatal编程技术网

Mysql Sequelize:WHERE-LIKE子句中的Concat字段

Mysql Sequelize:WHERE-LIKE子句中的Concat字段,mysql,node.js,sequelize.js,Mysql,Node.js,Sequelize.js,我正在使用sequelize ORM进行node.js项目。有一个查询,我需要对多个列的连接结果执行类似的操作 例如,如下所示: 从(CONCAT(firstname,,,lastname))中选择*,如“%John Do%” 我正在使用以下语法,并想知道这是否可能,而不必求助于使用原始查询(这在我的解决方案中是没有的) 有什么想法吗?你需要这样的东西 var criteria = { where: Sequelize.where(Sequelize.fn("concat", Seque

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

例如,如下所示:

从(CONCAT(firstname,,,lastname))中选择*,如“%John Do%”

我正在使用以下语法,并想知道这是否可能,而不必求助于使用原始查询(这在我的解决方案中是没有的)


有什么想法吗?

你需要这样的东西

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


灵感来自@code jaff,但您需要在名字和姓氏之间串联一个空格字符串,以使其正确工作。否则,它将只返回“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
)已被弃用,取而代之的是基于符号的运算符。这对安全来说是件好事

见:


这些操作符将替换为
[Sequelize.Op.like]
[Sequelize.Op.or]
。在他们的文档中突出显示的sequelize选项中也有其他配置方法

我能够通过基于@yjimk answer的新sequelize版本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}%`},
  }
})

我必须用
[Sequelize.Op.like]
替换
Sequelize.where中的
like
,才能让它工作。
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}%`},
  }
})