首页 文章

Sequelize:WHERE LIKE子句中的Concat字段

提问于
浏览
6

我正在使用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);
    });

有任何想法吗?

2 回答

  • 15

    你需要这样的东西

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

    注意:未经测试

    Original source

  • 10

    受@ code-jaff的启发,但你需要在名字和姓氏之间连接一个空格字符串,以使其正常工作 . 否则它只会返回'JohnDoe'而不是'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] . 还有其他方法可以在其文档中突出显示的续集选项中进行配置

相关问题