You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS TypeORM PostgreSQL中OR组合查询失效问题

NestJS + TypeORM PostgreSQL 查询OR条件不生效问题修复

问题说明

在NestJS项目中使用TypeORM操作PostgreSQL时,期望实现以下查询逻辑:

  • 输入searchText时,以OR模式匹配name或agreementNumber字段(任一匹配即可)
  • 同时支持结合id、enquiryId、applicantId的精确筛选
    但当前代码中的OR条件写法错误,导致无法达到预期效果。

错误原因

TypeORM的FindOptionsWhere对象并不支持_OR这种自定义属性写法,该属性无法被TypeORM解析,因此OR条件不生效。正确的多条件组合(AND + OR)需要将where构造成数组形式,通过数组元素组合AND逻辑,OR逻辑则嵌套在单个元素中。

修复方案

重新构造where条件:

  1. 先收集所有精确匹配的条件到一个对象中
  2. 如果存在searchText,则将精确条件对象与OR搜索条件组合成数组元素;若无精确条件,直接使用OR条件数组
  3. 如果没有searchText,则直接使用精确条件对象

修复后的完整代码

async findAll(filter: DataFilterDto): Promise<ApiResponseDto> {
    const take = filter.count || 10;
    const pageNo = filter.pageNo > 0 ? filter.pageNo - 1 : 0;
    const skip = pageNo * take;

    // 收集精确匹配条件
    const exactConditions: FindOptionsWhere<AgreementEntity> = {};
    if (HelperService.isValueValid(filter.id)) {
      exactConditions.id = filter.id;
    }
    if (HelperService.isValueValid(filter.enquiryId)) {
      exactConditions.enquiryId = filter.enquiryId;
    }
    if (HelperService.isValueValid(filter.applicantId)) {
      exactConditions.applicantId = filter.applicantId;
    }

    let where: FindOptionsWhere<AgreementEntity> | FindOptionsWhere<AgreementEntity>[] = exactConditions;

    if (HelperService.isValueValid(filter.searchText)) {
      const iLike = ILike(`%${filter.searchText}%`);
      const orConditions = [
        { name: iLike },
        { agreementNumber: iLike }
      ];

      // 组合精确条件与OR条件:精确条件 AND (name LIKE OR agreementNumber LIKE)
      if (Object.keys(exactConditions).length > 0) {
        where = [
          {
            ...exactConditions,
            OR: orConditions
          }
        ];
      } else {
        // 只有OR条件时直接使用数组
        where = orConditions;
      }
    }

    const query = {
      where: where,
      relations: ["enquiryInfo", "enquiryInfo.applicantInfo"],
      order: { id: SortOrder.Desc },
      take,
      skip,
    };

    let [result, total] = await this.agreementsRepo.findAndCount(query);
    return { data: result, count: total };
  }

代码说明

  • 精确筛选条件和OR搜索条件通过OR属性嵌套组合,TypeORM会自动解析为AND + OR逻辑:(精确条件) AND (name LIKE '%xxx%' OR agreementNumber LIKE '%xxx%')
  • 无精确条件时,直接使用OR条件数组,实现name LIKE '%xxx%' OR agreementNumber LIKE '%xxx%'逻辑
  • 无搜索文本时,直接使用精确条件对象,保持原有精确筛选逻辑

内容的提问来源于stack exchange,提问作者Code Guru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:11:04