TypeGraphQL+TypeORM场景下保存实体后如何返回关联关系数据
问题原因
你的报错核心是两个配置不匹配导致返回的产品实例中没有完整的Category实体数据:
- 入参
ProductInput定义错误:你给category字段指定的GraphQL类型是String,但TS类型是Category,前端传入的categoryId字符串只会被当做外键存入数据库,不会自动关联加载完整的分类实体 lazy: true的关联不会自动加载:TypeORM保存产品后返回的实例中,category是未执行的Promise,GraphQL解析时无法读取到categoryName字段,就会触发非空字段不能为空的报错。
解决方案
步骤1:修正ProductInput定义
将入参中接收分类的字段改为明确的categoryId,避免类型不匹配:
export default class ProductInput implements Partial<Product> { @Field() productName: string; // 替换原有category字段,明确接收分类ID @Field() categoryId: string; // 其余原有字段保持不变 @Field() productQuantity: number; @Field() productPrice: number; @Field() productPriceRA: number; @Field() productPriceKK: number; @Field() productSupplier: string; @Field() productOrderLink: string; @Field() productImage: string; }
步骤2:Product实体补充显式外键列
在Product实体中增加显式的categoryId外键列,TypeORM会自动关联到category关联字段,无需额外配置:
// 在category关联字段前增加外键列 @Field() @Column() categoryId: string; @Field(() => Category) @ManyToOne(() => Category, (category: Category) => category.products, { cascade: true, lazy: true }) @JoinColumn() category: Category;
步骤3:修改Resolver逻辑,主动加载关联数据
保存产品后主动触发lazy关联的加载,确保返回的实例有完整的分类数据:
@Mutation(() => Product, { description: 'Add new product' }) async addProduct( @Arg('product') productInput: ProductInput ): Promise<Product> { const product = Product.create(productInput); await product.save(); // 主动await lazy关联,加载完整分类数据 await product.category; return product; }
可选替代方案(非lazy关联场景)
如果你后续把lazy: true改为默认的false,保存后可以直接用带关联查询的find方法返回完整数据,性能损耗非常小,远低于全量查询:
@Mutation(() => Product, { description: 'Add new product' }) async addProduct( @Arg('product') productInput: ProductInput ): Promise<Product | undefined> { const product = await Product.create(productInput).save(); return Product.findOne({ where: { productID: product.productID }, relations: ['category'] }); }
内容的提问来源于stack exchange,提问作者Stoyko Tolev
相关产品推荐
相关产品推荐

