在 TypeGraphQL 中使用 ManyToOne 关系返回 null

时间:2021-05-18 06:53:48

标签: node.js typescript typeorm typegraphql

为了学习,我做了一个测试 TypeGraphql 和 TypeORM 的项目。我有一个 UserBook 实体,我想在 created_by 实体上有一个 Book 字段。

@ObjectType()
@Entity()
export class Book extends BaseEntity {
  @Field(() => ID)
  @PrimaryGeneratedColumn()
  readonly id: number;

  @Field({ nullable: true })
  @Column({ nullable: true })
  name: string;

  @Field(() => User)
  @ManyToOne(() => User)
  @JoinColumn({ name: 'created_by' })
  created_by: User;
  // @RelationId((orthodontist: Orthodontist) => orthodontist.created_by)
  // createdById: number;
}

@ObjectType()
@Entity()
export class User extends BaseEntity {
    @Field(() => ID)
    @PrimaryGeneratedColumn()
    id: number;

    @Field({ nullable: true })
    @Column({ nullable: true })
    first_name?: string;

    @Field({ nullable: true })
    @Column({ nullable: true })
    last_name?: string;

    @Field()
    @Column({ unique: true })
    email: string;

    @Column()
    password: string;

    @Field(() => [Book!])
    @OneToMany(() => Book, book => book.created_by)
    created_books: Book[];

}

对于我的解析器,它看起来像这样,正如文档所说,我正在正确加载。

@Resolver(Book)
export class OrthodontistResolver {

    @Query(() => [Book])
    books(): Promise<Book[]> {
        return Book.find();
    }
}

当我进入我的 GraphQL Playground 并查询如下内容时:

{
  books {
    name,
    id,
  }
}

一切正常并返回正确的数据。但是,当我尝试像这样使用 created_by 字段时:

{
  orthodontists {
    name,
    id,
    created_by {
      id
    }
  }
}

它给了我以下错误:

<块引用>

不能为非空字段 Book.created_by 返回空值。

我确保该关系存在于数据库中,并使用它的 FK 正确设置。然而这是从哪里来的?我怎样才能解决这个问题?我确实尝试使用 @RelationId 装饰器,如第一个代码示例所示。不幸的是它没有用。

编辑:

数据库中只有一本书,其中 created_by 字段不为空。

1 个答案:

答案 0 :(得分:1)

更改您的 library(data.table) microbenchmark::microbenchmark( base = do.call(rbind, strsplit(unlist(strsplit(b$b, " ", TRUE)), ",", TRUE)) , baseNum = matrix(as.numeric(unlist(strsplit(unlist(strsplit(b$b, " ", TRUE)), ",", TRUE))), ncol=2, byrow=TRUE) , data.table = as.data.table(tstrsplit(unlist(strsplit(b$b, ' ', T)), ',', T)) ) #Unit: microseconds # expr min lq mean median uq max neval cld # base 28.829 30.2965 33.08313 31.5705 33.0475 85.880 100 a # baseNum 29.832 31.3030 33.51445 32.3635 34.5395 56.851 100 a # data.table 143.745 147.9900 155.41194 150.9960 157.2420 278.190 100 b 解析器以在使用 books 操作时返回关系 created_by

find