这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
一. Sequelize 应用 WHERE 子句
where
参数用于过滤查询.where
子句有很多运算符,可以从中以 Symbols 的形式使用.
User.findAll({
where: {
name: '李华'
}
});
// SELECT * FROM user WHERE name = '李华'
sequelize.Op
可以进行相等比较值
const { Op } = require("sequelize");
User.findAll({
where: {
name: {
[Op.eq]:'李华'
}
}
});
// SELECT * FROM user WHERE name = '李华'
也可以传递多个校验值:
User.findAll({
where: {
age: 18
name: '李华'
}
});
// SELECT * FROM user WHERE age = 18 AND name = '李华';
这里用Op.and
也是对等Op.eq
**const { Op } = require("sequelize");
User.findAll({
where: {
[Op.and]: [
{ age: 18 },
{ name: '李华' }
]
}
});
// SELECT * FROM user WHERE age = 18 AND name = '李华';
OR
可以通过类似的方式执行:
const { Op } = require("sequelize");
User.findAll({
where: {
[Op.or]: [
{ age: 18 },
{ age: 30 }
]
}
});
// SELECT * FROM user WHERE age = 18 OR age = 30;
OR
涉及相同字段 ,因此 Sequelize 可以使用数组的形式作为参数值
const { Op } = require("sequelize");
User.destroy({
where: {
age: {
[Op.or]: [12, 13]
}
}
});
// DELETE FROM user WHERE age = 12 OR age = 13;
二. Sequelize 提供了多种运算符.
const { Op } = require("sequelize");
Post.findAll({
where: {
[Op.and]: [{ a: 5 }, { b: 6 }], // (a = 5) AND (b = 6)
[Op.or]: [{ a: 5 }, { b: 6 }], // (a = 5) OR (b = 6)
someAttribute: {
// 基本
[Op.eq]: 3, // = 3
[Op.ne]: 20, // != 20
[Op.is]: null, // IS NULL
[Op.not]: true, // IS NOT TRUE
[Op.or]: [5, 6], // (someAttribute = 5) OR (someAttribute = 6)
// 使用方言特定的列标识符 (以下示例中使用 PG):
[Op.col]: 'user.organization_id', // = "user"."organization_id"
// 数字比较
[Op.gt]: 6, // > 6
[Op.gte]: 6, // >= 6
[Op.lt]: 10, // < 10
[Op.lte]: 10, // <= 10
[Op.between]: [6, 10], // BETWEEN 6 AND 10
[Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15
// 其它操作符
[Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)
[Op.in]: [1, 2], // IN [1, 2]
[Op.notIn]: [1, 2], // NOT IN [1, 2]
[Op.like]: '%hat', // LIKE '%hat'
[Op.notLike]: '%hat', // NOT LIKE '%hat'
[Op.startsWith]: 'hat', // LIKE 'hat%'
[Op.endsWith]: 'hat', // LIKE '%hat'
[Op.substring]: 'hat', // LIKE '%hat%'
[Op.iLike]: '%hat', // ILIKE '%hat' (不区分大小写) (仅 PG)
[Op.notILike]: '%hat', // NOT ILIKE '%hat' (仅 PG)
[Op.regexp]: '^[h|a|t]', // REGEXP/~ '^[h|a|t]' (仅 MySQL/PG)
[Op.notRegexp]: '^[h|a|t]', // NOT REGEXP/!~ '^[h|a|t]' (仅 MySQL/PG)
[Op.iRegexp]: '^[h|a|t]', // ~* '^[h|a|t]' (仅 PG)
[Op.notIRegexp]: '^[h|a|t]', // !~* '^[h|a|t]' (仅 PG)
[Op.any]: [2, 3], // ANY ARRAY[2, 3]::INTEGER (仅 PG)
[Op.match]: Sequelize.fn('to_tsquery', 'fat & rat') // 匹配文本搜索字符串 'fat' 和 'rat' (仅 PG)
// 在 Postgres 中, Op.like/Op.iLike/Op.notLike 可以结合 Op.any 使用:
[Op.like]: { [Op.any]: ['cat', 'hat'] } // LIKE ANY ARRAY['cat', 'hat']
// 还有更多的仅限 postgres 的范围运算符,请参见下文
}
}
});
Op.in
的简写语法, 直接将数组参数传递给 where
使用 IN
运算符:
User.findAll({
where: {
age: [18,19,40] // 等同使用 `age: { [Op.in]: [18,19,40] }`
}
});
// SELECT ... FROM "user" AS "user" WHERE "user"."age" IN (18,19,40);