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

