Sequelize:WHERE LIKE子句中的Concat字段

时间:2015-09-24 03:29:09

标签: 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);
    });

有什么想法吗?

4 个答案:

答案 0 :(得分:16)

你需要这样的东西

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

注意:未经测试

Original source

答案 1 :(得分:11)

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

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

为那些可能无法理解其适合您的查询的人提供一些上下文,这是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 + '%' } }
    ]
  }
})

Sequelize 4.0的更新

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

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

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

答案 2 :(得分:0)

我能够使用基于@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}%`},
  }
})

答案 3 :(得分:0)

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' },
                ]
            }
        });