【问题标题】:Sequelize - How to search multiple columns?Sequelize - 如何搜索多个列?
【发布时间】:2016-03-19 06:29:07
【问题描述】:

我有一个包含多列文章的数据库,并且希望能够同时搜索 titledescription

目前,我有:

Article.findAll({
  where: {
    title: { like: '%' + searchQuery + '%' }
  }
});

我如何也可以搜索描述?

我已经阅读了the sequelize documentation,甚至在Complex filtering / OR / NOT queries 部分,但这些示例似乎只解释了在一列中的搜索。

【问题讨论】:

    标签: javascript sql node.js sequelize.js


    【解决方案1】:

    续集 >= 4.12

    const Op = Sequelize.Op;
    Article.findAll({
      where: {
        title: { [Op.like]: '%' + searchQuery + '%' },
        description: { [Op.like]: '%' + searchQuery2 + '%' }
      }
    });
    

    续集
    Article.findAll({
      where: {
        title: { like: '%' + searchQuery + '%' },
        description: { like: '%' + searchQuery2 + '%' }
      }
    });
    

    以上将确保title 包括searchQuery 并且 description 包括searchQuery2。但是,如果您希望在文章包含两者之一时返回结果,则以下查询应该有效:

    续集 >= 4.12

    const Op = Sequelize.Op;
    Article.findAll({
      where: {
        [Op.or]: [
         title: { [Op.like]: '%' + searchQuery + '%' },
         description: { [Op.like]: '%' + searchQuery2 + '%' }
        ]
      }
    });
    

    续集
    Article.findAll({
      where: {
        $or: [
         title: { like: '%' + searchQuery + '%' },
         description: { like: '%' + searchQuery2 + '%' }
        ]
      }
    });
    

    【讨论】:

    • 最新版sequelize修改了逻辑运算的语法,请查看docs.sequelizejs.com/manual/tutorial/querying.html
    • @SohamLawar 感谢您的提醒,我已将其添加到答案中,作为 Sequelize 4.12 及更高版本的首选方式。
    • 干得好,@leroydev
    • 这仍然强制记录包含标题和描述。如果我的一个参数不包括在内怎么办?
    • 是否有可能在不明确说明要搜索哪一列的情况下按表内的所有列进行搜索? @leroydev
    【解决方案2】:

    续集 >= 4.12

    Article.findAll({
     where = {
      [Op.or]: [
        { name: { [Op.like]: `%${req.query.query_string}%` } },
        { description: { [Op.like]: `%${req.query.query_string}%` } }
      ]
    }
    });
    

    仅供参考:mysql 不支持 iLike ;)

    【讨论】:

      【解决方案3】:

      您的问题是我第一次听说 sequelize.js,但我查看了 doco 并发现了这个:

      Project.findOne({
        where: {
          name: 'a project',
          $or: [
            { id: [1,2,3] },
            { id: { $gt: 10 } }
          ]
        }
      })
      
      Project.findOne({
        where: {
          name: 'a project',
          id: {
            $or: [
              [1,2,3],
              { $gt: 10 }
            ]
          }
        }
      })
      

      两段代码代码都会生成以下内容:

      SELECT *
      FROM `Projects`
      WHERE (
        `Projects`.`name` = 'a project'
         AND (`Projects`.`id` IN (1,2,3) OR `Projects`.`id` > 10)
      )
      LIMIT 1;
      

      这些示例的上面部分给出了允许的各种子句,包括 $and$or

      Project.findAll({
        where: {
          id: {
            $and: {a: 5}           // AND (a = 5)
            $or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
        ... etc
      

      【讨论】:

      • 感谢您的回复,如果我弄错了,请纠正我,但这仍然不仅搜索一列吗? (在本例中为Projects.id
      • 我认为这些连接符可以在字段之间的where 中使用。请参阅这些附近的 $not example 以用于两个不同的列。
      • 不幸的是,这在 sequelize 6 中不起作用。Sequelize 文档:stackoverflow.com/questions/34255792/… 提到 findOne 的可用选项很少。 findAll 方法支持此答案中提到的选项,但 findOne 不支持。
      猜你喜欢
      • 2023-01-26
      • 1970-01-01
      • 2016-02-24
      • 2016-02-21
      • 2022-01-09
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多