为了学习,我做了一个测试 TypeGraphql 和 TypeORM 的项目。我有一个 User
和 Book
实体,我想在 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
字段不为空。
答案 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