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

如何让TypeORM QueryBuilder正确处理AND嵌套OR的查询逻辑?

问题描述

编写了如下TypeORM QueryBuilder代码:

queryBuilder.andWhere('tdm.type =:type', { type: filters.type })
queryBuilder.andWhere('tdm.form =:form', { form: filters.formId })

if (filters.orLeadId && filters.orSupportId) {
  queryBuilder.andWhere(subQb => {
    subQb.where('tdm.leadId = :lead', { lead: filters.orLeadId }),
      subQb.orWhere('tdm.supportId = :support', {
        support: filters.orSupportId,
      })
  })
}

但生成的SQL忽略了之前的andWhere条件,仅得到:

SELECT "tdm"."id" AS "tdm_id", "tdm"."form_id" AS "tdm_form_id" FROM "tdm" "tdm" WHERE "tdm"."lead_id" = $1 OR "tdm"."support_id" = $2

需要修正代码,使其生成包含所有条件的正确SQL。

解决方案

问题出在子查询构建器的语法错误:subQb.where语句后误用了逗号,导致后续的orWhere没有被正确关联到子查询构建器的链式调用中,同时TypeORM的回调函数需要确保条件被正确合并。

修正后的代码如下:

queryBuilder.andWhere('tdm.type = :type', { type: filters.type })
queryBuilder.andWhere('tdm.form = :form', { form: filters.formId })

if (filters.orLeadId && filters.orSupportId) {
  queryBuilder.andWhere(subQb => {
    // 使用链式调用替代逗号分隔,确保OR条件被正确包裹在AND分组内
    return subQb.where('tdm.leadId = :lead', { lead: filters.orLeadId })
      .orWhere('tdm.supportId = :support', { support: filters.orSupportId })
  })
}

关键修正点:

  • 移除subQb.where后的逗号,改用链式调用.orWhere,保证两个OR条件被统一包裹在同一个AND逻辑分组中。
  • 显式返回子查询构建器实例(TypeORM可自动识别,显式返回更清晰)。

修正后生成的SQL会包含所有条件,示例如下:

SELECT "tdm"."id" AS "tdm_id", "tdm"."form_id" AS "tdm_form_id" FROM "tdm" "tdm" 
WHERE "tdm"."type" = $1 
AND "tdm"."form" = $2 
AND ("tdm"."lead_id" = $3 OR "tdm"."support_id" = $4)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:15:36