TypeORM与Nexus Schema中GraphQL关联字段返回空值问题求助
问题分析与解决方法
核心原因
你的Product实体中没有显式定义brand_id和category_id这两个列的属性——虽然通过@JoinColumn指定了外键列名,但TypeORM需要实体类中有对应的属性并标记@Column,才能将数据库中的字段值映射到实体对象上。Nexus在解析时,从parent(TypeORM返回的Product实体)中读取category_id和brand_id,但实体里没有这些属性,所以返回null。
解决步骤
1. 在Product实体中添加外键列的显式定义
修改Product实体代码,为brand_id和category_id添加@Column注解,确保TypeORM能映射数据库字段:
// Product.ts import { BaseEntity, Entity, Column, CreateDateColumn, UpdateDateColumn, PrimaryGeneratedColumn, OneToMany, ManyToOne, JoinColumn, } from 'typeorm'; // 其他导入保持不变 @Entity() export class Product extends BaseEntity { // 原有属性保持不变... @Column() creatorId!: number; // 添加以下两个外键列的显式定义 @Column() brand_id!: number; @Column() category_id!: number; @ManyToOne(() => User, (user) => user.products) creator: User; @ManyToOne(() => Brand, (brand) => brand.products) @JoinColumn({ name: 'brand_id' }) // 与上面的brand_id属性对应 brand: Brand; @ManyToOne(() => Category, (category) => category.products) @JoinColumn({ name: 'category_id' }) // 与上面的category_id属性对应 category: Category; // 其他关联和属性保持不变... }
2. 验证Nexus Schema与实体属性匹配
你的ProductType中已经定义了category_id和brand_id字段,只要实体中存在对应的属性,Nexus就能正确读取值:
// ProductType.ts export const ProductType = objectType({ name: 'Product', definition(t) { t.nonNull.int('id'); t.nonNull.string('name'); t.int('creatorId'); t.nonNull.int('category_id'); // 与实体中的category_id属性对应 t.nonNull.int('brand_id'); // 与实体中的brand_id属性对应 // 其他字段和resolve保持不变... }, });
3. 可选:确保查询时加载必要字段
如果使用自定义createQueryBuilder查询Product,要确保select语句中包含brand_id和category_id;如果用默认的find/findOne方法,TypeORM会自动选择所有实体中定义的列,无需额外配置。
额外说明
@JoinColumn的作用是指定外键列的名称,它需要对应实体中已定义的@Column属性,否则TypeORM无法正确映射。- 如果你不需要直接暴露外键ID,而是希望通过关联实体(比如
brand、category字段)获取数据,可以在Nexus中添加对应的字段并实现resolve函数,但当前需求是获取外键ID,显式定义列属性是最直接的解决方式。
内容的提问来源于stack exchange,提问作者xAdvitya
相关产品推荐
相关产品推荐

