Sequelize АБО об'єкт умови


77

Створюючи подібний об’єкт

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"

Однак це все умова "І", як я міг створити умову "АБО", створивши об'єкт умови?


1
я бачив 3 способи або використовується оператор ... where: { $or : [ {attr:val}, {attr:val}] }, where : { $or : { attr:val, attr2:val} },where: { attr: { $or: [val, val] } }
Мухаммад Umer

Відповіді:


86

Здається, зараз існує інший формат

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)
користувач3662456

3
Використовуйте [Op.or]зараз від sequelize, const { Op } = require('sequelize')а не $orяк ваш ключ для sequelize 5+. Вони змінили їх на символи.
kidcapital

36

Рядкові оператори будуть застарілими в майбутньому (ви, мабуть, бачили попередження в консолі).

Примусити цю роботу з символічними операторами було для мене досить заплутаним, і я оновив документи двома прикладами.

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]}} `
Мухаммад Умер

32

Використання Sequelize.or:

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

Довідка (пошук Sequelize.or)

Редагувати: Крім того, це було змінено, і для останнього методу див . Відповідь Моріо ,



16

Для Sequelize 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 ви також можете скористатися цим способом (повне використання 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.