TypeORM GraphQL嵌套查询返回null,如何获取关联Customer数据?
如何在TypeGraphQL中正确获取嵌套关联的Customer信息?
你遇到的核心问题是TypeORM默认不会自动加载关联实体——虽然你的模型已经正确定义了Project和Customer的双向关联,但Resolver里的查询并没有主动触发Customer数据的加载,所以最终返回了null。
问题根源
TypeORM的find()和findOne()方法默认采用懒加载策略:只有当你主动访问关联属性时,才会去数据库查询关联数据。但在GraphQL Resolver的场景下,Resolver返回结果后数据库连接通常会立即关闭,此时懒加载无法生效,关联字段自然返回null。
解决方案:主动加载关联关系
你需要在查询时明确指定要加载的关联字段,这里有两种常用且可靠的方式:
方式1:使用relations选项(简洁直观)
修改你的ProjectResolver中的查询方法,添加relations参数来指定要加载的关联实体:
import { Resolver, Query, Mutation, Arg } from "type-graphql"; import { Project } from "../models/Project"; @Resolver() export class ProjectResolver { @Query(() => [Project]) projects() { // 加载所有Project及其关联的Customer return Project.find({ relations: ['customer'] }); } @Query(() => Project) project(@Arg("id") id: string) { // 根据ID查询Project,并加载其关联的Customer return Project.findOne({ where: { id }, relations: ['customer'] }); } }
方式2:使用createQueryBuilder(灵活适配复杂查询)
如果需要更精细的查询控制(比如筛选关联字段、添加额外条件),可以用QueryBuilder手动关联并选择数据:
@Query(() => Project) async project(@Arg("id") id: string) { return await Project.createQueryBuilder('project') .leftJoinAndSelect('project.customer', 'customer') // 关联并选择Customer表数据 .where('project.id = :id', { id }) .getOne(); }
验证修改
完成修改后,重新执行你的示例查询:
{ project(id: "1"){ id name customer{ id name } } }
此时就能正确返回关联的Customer数据了。
额外提示:关于懒加载
如果你确实想尝试懒加载,可以在模型的关联装饰器中添加lazy: true选项,但需要确保Resolver的执行全程处于数据库事务中(或保持连接打开),否则依然会返回null。不过对于GraphQL场景,主动加载关联关系是更稳妥的选择——它能明确控制查询范围,还能避免潜在的N+1查询性能问题。
内容的提问来源于stack exchange,提问作者Matesko77
相关产品推荐
相关产品推荐

