2026-03-17 14:26:11
在 Sequelize ORM 中构建嵌套的 AND 和 OR 条件查询,可以通过组合 Op.and 和 Op.or 操作符来实现。以下是详细的方法和示例:
核心方法使用 Op 操作符Sequelize 提供了 Op 对象(通常通过 const { Op } = require('sequelize') 引入),其中包含逻辑操作符如 and、or、not 等。
嵌套条件结构
Op.and: 所有条件必须满足(相当于 SQL 的 AND)。
Op.or: 任一条件满足即可(相当于 SQL 的 OR)。
条件可以多层嵌套,形成复杂的逻辑组合。
如果需要根据动态输入(如前端传参)构建条件,可以遍历参数并组合 Op:
function buildWhereClause(conditions) { const where = {}; conditions.forEach(cond => { const { field, value, action = 'equals', logicalOp = 'and' } = cond; // 构建单个条件 const condition = {}; if (action === 'like') { condition[field] = { [Op.like]: `%${value}%` }; } else { condition[field] = value; } // 合并到主条件(AND/OR) if (!where[logicalOp]) { where[logicalOp] = [condition]; } else { where[logicalOp].push(condition); } }); return where;}// 示例输入const conditions = [ { field: 'name', value: 'John', action: 'like', logicalOp: 'and' }, { field: 'age', value: 30, action: 'equals', logicalOp: 'or' }, { field: 'status', value: 'active', action: 'equals', logicalOp: 'or' }];const where = buildWhereClause(conditions);// 输出:{ and: [{ name: { [Op.like]: '%John%' } }, or: [{ age: 30 }, { status: 'active' }]] }3. 修复原代码问题原代码中的问题(如循环变量越界、错误的 Object.assign 用法)可通过以下方式修正:
const { Op } = require('sequelize');function buildWhere(whereList) { const _where_arr = {}; for (let i = 0; i < whereList.length; i++) { const item = whereList[i]; const prevItem = i > 0 ? whereList[i - 1] : null; // 处理逻辑操作符(AND/OR/NOT) if (item.op === 'and' || item.op === 'or' || item.op === 'not') { const condition = {}; if (item.action === 'equals') { condition[item.field] = item.value; } else if (item.action === 'like') { condition[item.field] = { [Op.like]: `%${item.value}%` }; } if (item.op === 'and') { _where_arr[Op.and] = _where_arr[Op.and] ? [..._where_arr[Op.and], condition] : [condition]; } else if (item.op === 'or') { const prevCondition = prevItem ? { [prevItem.field]: prevItem.value } : {}; _where_arr[Op.or] = [prevCondition, condition]; } } else { // 默认处理(无逻辑操作符) if (item.action === 'equals') { _where_arr[item.field] = item.value; } else if (item.action === 'like') { _where_arr[item.field] = { [Op.like]: `%${item.value}%` }; } } } return _where_arr;}关键注意事项避免下标越界在访问 where[w][i-1] 时,需检查 i > 0(如修正后的代码所示)。
正确使用 Object.assign原代码中的 object.assign 应改为 Object.assign(),但更推荐直接操作对象属性(如 _where_arr[Op.or] = [...])。
简化条件判断如果 _item 的结构固定(如 [op, field, value, action]),无需检查 _item[3],直接解构即可。
通过以上方法,可以灵活构建复杂的 Sequelize 查询条件。