Sequelize OR条件对象

Mor*_*rio 55 node.js sequelize.js

通过创建这样的对象

var condition=
{
  where:
  {
     LastName:"Doe"?
     FirstName:["John","Jane"],
     Age:{
       gt:18
     }
  }    
}
Run Code Online (Sandbox Code Playgroud)

并把它传递进去

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

})
Run Code Online (Sandbox Code Playgroud)

它可以像这样精美地生成SQL

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

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

Mor*_*rio 70

似乎现在有另一种格式

where: {
    LastName: "Doe",
    $or: [
        {
            FirstName: 
            {
                $eq: "John"
            }
        }, 
        {
            FirstName: 
            {
                $eq: "Jane"
            }
        }, 
        {
            Age: 
            {
                $gt: 18
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

会产生

WHERE LastName='Doe' AND (FirstName = 'John' OR FirstName = 'Jane' OR Age > 18)
Run Code Online (Sandbox Code Playgroud)

请参阅doc:http://docs.sequelizejs.com/en/latest/docs/querying/#where

  • 现在使用sequelize 中的“[Op.or]”,“const { Op } = require('sequelize')”,而不是“$or”,作为sequelize 5+ 的密钥。他们把它们变成了符号。 (3认同)
  • 这应该是“$or: { ... }”。注意,“[”和“]”应该变成“{”和“}” (2认同)

小智 28

用途Sequelize.or:

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

参考(搜索Sequelize.or)

编辑:此外,这已被修改,对于最新的方法,请参阅Morio的答案,


Cor*_*usK 19

将来不推荐使用基于字符串的运算符(您可能已在控制台中看到警告).

让这个与符号运算符一起工作对我来说非常困惑,我用两个例子更新了文档.

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;
Run Code Online (Sandbox Code Playgroud)


Eva*_*oky 15

请参阅有关查询文档.

这将是:

$or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
Run Code Online (Sandbox Code Playgroud)


inm*_*yth 10

对于Sequelize 4

询问

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

运算符的语法

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]
    }
  }
}
));
Run Code Online (Sandbox Code Playgroud)

笔记

  • 为了更好的安全性 Sequelize建议下探别名运营商$(例如$and,$or...)
  • 除非您已{freezeTableName: true}在表格模型中设置,否则Sequelize将查询其复数形式的名称(学生 - > 学生)


Muh*_*ari 6

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

var condition = 
{ 
  [Op.or]: [ 
   { 
     LastName: {
      [Op.eq]: "Doe"
      },
    },
   { 
     FirstName: {
      [Op.or]: ["John", "Jane"]
      }
   },
   {
      Age:{
        [Op.gt]: 18
      }
    }
 ]
}
Run Code Online (Sandbox Code Playgroud)

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

const Op = require('Sequelize').Op
Run Code Online (Sandbox Code Playgroud)

并传递给:

Student.findAll(condition)
.success(function(students){ 
//
})
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

where: {
          [Op.or]: [
            {
              id: {
                [Op.in]: recordId,
              },
            }, {
              id: {
                [Op.eq]: recordId,
              },
            },
          ],
        },
Run Code Online (Sandbox Code Playgroud)

这对我有用!