Sequelize使用where.push时如何调整WHERE子句的括号优先级
解决方案
你的问题本质是SQL逻辑运算符优先级导致的:SQL中AND的优先级天然高于OR,你零散向where数组中推入条件的写法,会让Sequelize将最后一个OR条件和后续的AND条件优先结合,最终生成的括号不符合预期。
你需要将所有需要作为一组的OR逻辑用Sequelize内置的Op.or操作符封装,Sequelize会自动为这组条件加上外层括号,再和sId的AND条件并列即可。
第一步:引入操作符
首先引入Sequelize的逻辑操作符:
const { Op } = require('sequelize');
第二步:构造查询条件
写法1:直接构造完整where对象(推荐)
const where = { [Op.and]: [ // 所有OR条件会被自动套上外层括号 { [Op.or]: [ { version: false }, { name: { [Op.like]: `%${id1}%` } }, { name: { [Op.like]: `%${id2}%` } } ] }, // 独立的AND条件 { sId: { [Op.in]: sIds } } ] };
写法2:使用push方法(兼容你原来的写法习惯)
const where = []; // 先推入整个OR条件组 where.push({ [Op.or]: [ { version: false }, { name: { [Op.like]: `%${id1}%` } }, { name: { [Op.like]: `%${id2}%` } } ] }); // 再推入sId的IN查询条件 where.push({ sId: { [Op.in]: sIds } });
优化说明
上面的写法没有使用Sequelize.literal拼接LIKE语句,避免了SQL注入风险,是更安全的Sequelize原生写法,最终生成的SQL结构和你期望的完全一致。
内容的提问来源于stack exchange,提问作者CycleGeek
相关产品推荐
相关产品推荐

