排序或条件对象


76

通过创建这样的对象

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”条件?


1
我已经看到3种方式或正在使用的运营商...... where: { $or : [ {attr:val}, {attr:val}] }where : { $or : { attr:val, attr2:val} }where: { attr: { $or: [val, val] } }
穆罕默德乌默尔

Answers:


85

似乎现在有另一种格式

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


1
这应该是$or: { ... }。请注意,[]应该成为{}
briangonzalez

1
你们都是错误的,请参阅我的答案以获取正确的语法。
埃文·西洛基

我更喜欢在@evanhadfield建议使用和/或功能方法之前使用这种方法,因为它更整洁。
mraxus

我将如何继续进行以下工作?...其中(A或B)和(C或D)
user3662456 '19

3
[Op.or]现在使用sequelizeconst { Op } = require('sequelize')代替$orsequelize 5+作为密钥。他们将它们更改为符号。
kidcapital

34

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

使它与符号运算符一起使用对我来说非常令人困惑,并且我用两个示例更新了文档

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种方式或运算符了... val}}`,`其中:{attr:{$ or:[val,val]}}`
穆罕默德·乌默尔

32

用途Sequelize.or

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

参考(搜索Sequelize.or

编辑:此外,这已被修改,有关最新方法,请参见Morio的答案



16

对于续集4

询问

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

运算符的语法

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

笔记

  • 为了提高安全性, Sequelize建议删除别名运算符$(例如$and$or...)
  • 除非您{freezeTableName: true}在表模型中进行了设置,否则Sequelize将针对其名称的复数形式进行查询(Student-> Students

16

在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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.