Untuk pembelajaran, saya membuat proyek pengujian TypeGraphql, bersama dengan TypeORM. Saya memiliki entitas User dan Book, di mana saya ingin memiliki bidang created_by pada entitas 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[];

}

Untuk resolver saya, tampilannya hanya seperti ini, yang saya muat dengan benar seperti yang dikatakan dokumen.

@Resolver(Book)
export class OrthodontistResolver {

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

Ketika saya masuk ke taman bermain GraphQL saya, dan menanyakan sesuatu seperti ini:

{
  books {
    name,
    id,
  }
}

Semuanya berfungsi dan mengembalikan data yang benar. Namun, ketika saya mencoba menggunakan bidang created_by seperti ini:

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

Ini memberi saya kesalahan berikut:

Tidak dapat mengembalikan null untuk bidang non-nullable Book.created_by.

Saya memastikan hubungan ada di database, dan mengaturnya dengan benar dengan FK-nya. Ini dari mana? Bagaimana saya bisa memperbaiki ini? Saya memang mencoba menggunakan dekorator @RelationId, seperti yang terlihat pada contoh kode pertama. Sayangnya tidak berhasil.

EDIT:

Hanya ada satu buku dalam database, di mana bidang created_by bukan nol.

0
Bas 18 Mei 2021, 09:53

1 menjawab

Jawaban Terbaik

Ubah resolver books Anda untuk mengembalikan hubungan created_by saat menggunakan operasi find:

@Resolver(Book)
export class OrthodontistResolver {

  @Query(() => [Book])
  books(): Promise<Book[]> {
    return Book.find({
      relations: ["created_by"],
    });
  }
}
1
Eranga Heshan 18 Mei 2021, 08:10