如何在TypeORM的FindOptionsWhere中实现可选关联属性的条件查询?
解决TypeORM中同时查询含/不含关联属性的实体问题
刚好碰到过类似的场景!你要的就是「条件可选匹配」——当关联属性存在时才应用过滤条件,不存在就直接保留,完全不用分两次调用数据库。
TypeORM的FindOptionsWhere支持用数组形式表达OR逻辑,刚好能实现这个需求。我们可以把查询条件拆成两个分支,用OR合并:
import { IsNull, In } from "typeorm"; // 构建OR条件数组:满足任意一个分支即可 const where: FindOptionsWhere<QuestionTranslation>[] = [ // 分支1:问题没有options,直接纳入结果 { question: { // 保留你原本的其他属性条件 options: IsNull() } }, // 分支2:问题有options,且options的translations符合指定语言要求 { question: { // 同样保留你原本的其他属性条件 options: { translations: { lang: In([localeCode, baseLocaleCode, LocaleCode.en]), }, }, }, } ]; const questionTranslations = await this.questionTranslationRepository.find({ where });
原理说明:
- TypeORM会自动将
FindOptionsWhere数组解析为OR查询,只要实体满足数组中任意一个条件就会被返回。 - 第一个分支用
IsNull()匹配所有没有关联options的问题,确保它们不会被过滤掉。 - 第二个分支匹配存在
options且选项翻译包含指定语言的问题,同时会加载符合条件的选项翻译数据。
这样一次查询就能同时覆盖两种场景:无选项的问题完整保留,有选项的问题只有当选项翻译符合要求时才会被返回(且带上对应选项的翻译数据),完美符合你的需求~
内容的提问来源于stack exchange,提问作者Mr_Aramaki
相关产品推荐
相关产品推荐

