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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:17:41