Объект Sequelize OR

Создав такой объект

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

Кажется, сейчас есть другой формат

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/ru/latest/docs/querying/#where

Ответ 2

Использовать Sequelize.or:

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

Ссылка (поиск Sequelize.or)

Edit: Кроме того, это было изменено, и для последнего метода см. Ответ Morio,

Ответ 4

Операторы на основе строк будут устаревать в будущем (вероятно, вы видели предупреждение в консоли).

Получение этого для работы с символическими операторами было довольно запутанным для меня, и я обновил документы двумя примерами.

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;

Ответ 5

Для продолжения 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)

Ответ 6

В 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"