【问题标题】:Sequelize OR condition objectSequelize OR 条件对象
【发布时间】:2014-01-08 19:27:04
【问题描述】:

通过创建这样的对象

var condition=
{
  where:
  {
     LastName:"Doe",
     FirstName:["John","Jane"],
     Age:{
       gt:18
     }
  }    
}

并传入

Student.findAll(condition)
.success(function(students){

})

它可以像这样漂亮地生成 SQL

"SELECT * FROM Student WHERE LastName='Doe' AND FirstName in ("John","Jane") AND Age>18"

但是,这都是'AND'条件,我如何通过创建条件对象来生成'OR'条件?

【问题讨论】:

  • 我已经看到 3 种方式或运算符被使用...where: { $or : [ {attr:val}, {attr:val}] }where : { $or : { attr:val, attr2:val} }where: { attr: { $or: [val, val] } }

标签: node.js sequelize.js


【解决方案1】:

现在好像还有别的格式

where: {
    LastName: "Doe",
    $or: [
        {
            FirstName: 
            {
                $eq: "John"
            }
        }, 
        {
            FirstName: 
            {
                $eq: "Jane"
            }
        }, 
        {
            Age: 
            {
                $gt: 18
            }
        }
    ]
}

会生成

WHERE LastName='Doe' AND (FirstName = 'John' OR FirstName = 'Jane' OR Age > 18)

查看文档:http://docs.sequelizejs.com/en/latest/docs/querying/#where

【讨论】:

  • 这应该是$or: { ... }。注意,[] 应该变成 {}
  • 你们都错了,请参阅我的答案以了解正确的语法。
  • 我更喜欢这种方式,而不是@evanhadfield 建议的和/或功能方式,因为它更整洁。
  • 我将如何在续集中执行以下操作? ...其中(A 或 B)和(C 或 D)
  • 现在使用[Op.or] 来自sequelize,const { Op } = require('sequelize'),而不是$or,作为sequelize 5+ 的关键。他们把它们改成了符号。
【解决方案2】:

基于字符串的运算符将在未来被弃用(您可能已经在控制台中看到了警告)。

让这个与符号运算符一起工作让我很困惑,我用两个例子更新了docs

Post.findAll({
  where: {
    [Op.or]: [{authorId: 12}, {authorId: 13}]
  }
});
// SELECT * FROM post WHERE authorId = 12 OR authorId = 13;

Post.findAll({
  where: {
    authorId: {
      [Op.or]: [12, 13]
    }
  }
});
// SELECT * FROM post WHERE authorId = 12 OR authorId = 13;

【讨论】:

  • 我见过 3 种方式或运算符被使用... ` where: { $or : [ {attr:val}, {attr:val}] } ` , ` where : { $or : { attr:val, attr2:val} } ` , ` 其中:{ attr: { $or: [val, val] } } `
【解决方案3】:

使用Sequelize.or:

var condition = {
  where: Sequelize.and(
    { name: 'a project' },
    Sequelize.or(
      { id: [1,2,3] },
      { id: { lt: 10 } }
    )
  )
};

Reference(搜索Sequelize.or

编辑:另外,这已被修改,最新方法见Morio's answer

【讨论】:

    【解决方案4】:

    在 Sequelize 版本 5 中,您也可以使用这种方式(完全使用 Operator Sequelize):

    var condition = 
    { 
      [Op.or]: [ 
       { 
         LastName: {
          [Op.eq]: "Doe"
          },
        },
       { 
         FirstName: {
          [Op.or]: ["John", "Jane"]
          }
       },
       {
          Age:{
            [Op.gt]: 18
          }
        }
     ]
    }
    

    然后,您必须包含以下内容:

    const Op = require('Sequelize').Op
    

    并传入:

    Student.findAll(condition)
    .success(function(students){ 
    //
    })
    

    它可以像这样漂亮地生成 SQL:

    "SELECT * FROM Student WHERE LastName='Doe' OR FirstName in ("John","Jane") OR Age>18"
    

    【讨论】:

    • 非常感谢!你救了我的命,兄弟。我遇到了('Sequelize/type')错误,您对导入的详细回答确实帮助了我。
    【解决方案5】:

    对于续集 4

    查询

    SELECT * FROM Student WHERE LastName='Doe' 
    AND (FirstName = "John" or FirstName = "Jane") AND Age BETWEEN 18 AND 24 
    

    Operators 的语法

    const Op = require('Sequelize').Op;
    
    var r = await to (Student.findAll(
    {
      where: {
        LastName: "Doe",
        FirstName: {
          [Op.or]: ["John", "Jane"]
        },
        Age: {
          // [Op.gt]: 18
          [Op.between]: [18, 24]
        }
      }
    }
    ));
    

    注意事项

    • 避免使用alias operators $(例如$and$or ...),因为这些将被弃用
    • 除非您在表模型中设置了{freezeTableName: true},否则 Sequelize 将查询其名称的复数形式 (Student -> Students)

    【讨论】:

      【解决方案6】:

      请参阅docs about querying

      应该是:

      $or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
      

      【讨论】:

        【解决方案7】:
        where: {
                  [Op.or]: [
                    {
                      id: {
                        [Op.in]: recordId,
                      },
                    }, {
                      id: {
                        [Op.eq]: recordId,
                      },
                    },
                  ],
                },
        

        这对我有用!

        【讨论】:

          猜你喜欢
          • 2019-08-10
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 2021-10-28
          • 2011-12-31
          • 1970-01-01
          • 2014-08-21
          • 2012-08-03
          相关资源
          最近更新 更多