【问题标题】:Sequelize: Concat fields in WHERE LIKE clauseSequelize:WHERE LIKE 子句中的 Concat 字段
【发布时间】:2015-12-21 13:18:12
【问题描述】:

我正在为我正在处理的 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);
    });

有什么想法吗?

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:
    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' },
                    ]
                }
            });
    

    【讨论】:

      【解决方案2】:

      我能够使用基于@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】:

      受@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)已被弃用,取而代之的是基于符号的运算符。这对安全来说是件好事

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

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

      【讨论】:

      • 我必须将 Sequelize.where 中的 like 替换为 [Sequelize.Op.like] 才能正常工作。
      【解决方案4】:

      你需要这样的东西

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

      注意:未经测试

      Original source

      【讨论】:

        猜你喜欢
        • 2013-05-16
        • 2011-02-09
        • 1970-01-01
        • 2012-11-01
        • 2013-08-03
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多