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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:35:08