TypeORM中如何基于数组生成多组AND拼接OR的WHERE查询条件
TypeORM 动态生成多组OR拼接WHERE条件实现方案
你要的需求可以通过TypeORM原生语法优雅实现,不需要手动拼接SQL字符串,同时能适配任意长度的二维数组条件。
方案1:基于QueryBuilder的灵活写法(适合复杂查询场景)
使用TypeORM提供的Brackets类可以完美包裹OR条件组,你提到的类似andWhere(orWhere())的写法完全支持:
- 首先导入依赖
import { Brackets } from 'typeorm';
- 拼接查询条件
你已经拿到了statusMap二维数组,直接在QueryBuilder中使用即可:
const tskQuery = createQueryBuilder('tsk') // 可在此处添加其他固定查询条件 .where( new Brackets((qb) => { statusMap.forEach(([category, status], idx) => { // 每个数组对应一组 AND 条件 const condition = `tsk.category = :category${idx} AND tsk.status = :status${idx}`; const params = { [`category${idx}`]: category, [`status${idx}`]: status, }; idx === 0 ? qb.where(condition, params) : qb.orWhere(condition, params); }); }) ); // 最终执行查询 const result = await tskQuery.getMany();
如果需要把这组OR条件和其他条件做AND拼接,只需要把上面的.where改成.andWhere即可,生成的SQL完全符合你的要求,所有参数都是预编译绑定,不存在SQL注入风险。
方案2:基于FindOptions的极简写法(适合简单查询场景)
如果你的查询逻辑不复杂,直接用TypeORM的find方法更简洁:
TypeORM 中where参数传入对象数组时,会默认将数组内的每个对象做OR拼接,对象内部的多个字段做AND拼接,正好匹配你的需求
const result = await tskRepository.find({ where: statusMap.map(([category, status]) => ({ category, status, })), // 可继续添加orderBy、take等其他查询配置 });
内容的提问来源于stack exchange,提问作者Maxime B
相关产品推荐
相关产品推荐

