You need to enable JavaScript to run this app. TypeORM中如何基于数组生成多组AND拼接OR的WHERE查询条件
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM中如何基于数组生成多组AND拼接OR的WHERE查询条件

TypeORM 动态生成多组OR拼接WHERE条件实现方案

你要的需求可以通过TypeORM原生语法优雅实现,不需要手动拼接SQL字符串,同时能适配任意长度的二维数组条件。


方案1:基于QueryBuilder的灵活写法(适合复杂查询场景)

使用TypeORM提供的Brackets类可以完美包裹OR条件组,你提到的类似andWhere(orWhere())的写法完全支持:

  1. 首先导入依赖
import { Brackets } from 'typeorm';
  1. 拼接查询条件
    你已经拿到了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 16:06:03