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

TypeORM关联条件不匹配时主查询无返回数据的解决咨询

解决关联条件不匹配时主查询返回空的问题

你当前的查询把关联条件直接写在where里,这会让TypeORM默认使用内连接——只有当课程存在匹配accountId的takeTask关联时,才会返回该课程;没有匹配关联的课程会被直接过滤掉。要获取所有符合diffsess和deletedAt条件的课程(不管是否存在匹配的takeTask),可以用以下两种方式修改:

方式一:使用QueryBuilder实现左连接

QueryBuilder能更灵活地控制连接类型和条件,把关联条件放在连接的ON子句中,而不是主查询的WHERE:

const courses = await getRepository(Course)
  .createQueryBuilder("course")
  // 左连接关联,即使没有匹配的takeTask也保留课程
  .leftJoinAndSelect("course.lessons", "lesson")
  .leftJoinAndSelect("lesson.tasks", "task")
  .leftJoinAndSelect("task.takeTask", "takeTask", "takeTask.account.id = :accountId", { accountId })
  // 主查询条件
  .where("course.diffsess.id = :dsId", { dsId: ds.id })
  .andWhere("course.deletedAt IS NULL")
  .skip(skip)
  .take(limit)
  .getMany();

这样所有符合diffsess和deletedAt的课程都会被返回,匹配的takeTask会被加载,没有匹配的则对应字段为空数组。

方式二:调整find方法的关联配置(TypeORM 0.3+适用)

如果你想继续用find方法,可以通过join配置指定左连接和关联条件:

const courses = await Course.find({
  where: {
    diffsess: { id: ds.id },
    deletedAt: IsNull(),
  },
  relations: {
    lessons: {
      tasks: {
        takeTask: {
          account: true,
        },
      },
    },
  },
  join: {
    alias: "course",
    leftJoinAndSelect: {
      lesson: "course.lessons",
      task: "lesson.tasks",
      takeTask: "task.takeTask",
    },
    on: {
      "takeTask.account.id": accountId,
    },
  },
  skip,
  take: limit,
});

注意点

  • 如果你的需求是仅返回存在匹配takeTask的课程,那当前查询返回空是正常逻辑;但如果要保留无匹配关联的课程,就用上述左连接的方式。
  • 确保实体关系的外键映射正确,避免因字段名错误导致的查询异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:33:13