如何让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
相关产品推荐
相关产品推荐

