Объект 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,
Ответ 3
См. Документы о запросе.
Это было бы:
$or: [{a: 5}, {a: 6}] // (a = 5 OR a = 6)
Ответ 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"