gpt4 book ai didi

express - 使用 type-graphql typeorm 和 dataloader 处理一对多的最佳方法

转载 作者:行者123 更新时间:2023-12-03 14:37:35 26 4
gpt4 key购买 nike

我试图找出使用 type-graphql 和 typeorm 和 postgresql db(使用 apollo 服务器和 express)处理一对多关系的最佳方法。我有一个与类(class)表具有一对多关系的用户表。我目前处理此问题的方法是使用 @RelationId 字段创建一列 userCourseIds,然后使用 @FieldResolver 和 dataloader 批量获取属于该用户的类(class)。我的问题是,对于 @RelationId 字段,无论我是否实际查询 userCourses,都会进行一个单独的查询来获取关系 ID。有没有办法解决这个问题,它不会进行额外的查询,或者有没有更好的方法来处理一对多关系?
关系的用户端:

@OneToMany(() => Course, (course) => course.creator, { cascade: true })
userCourses: Course[];
@RelationId((user: User) => user.userCourses)
userCourseIds: string;
关系的类(class)方面:
@Field()
@Column()
creatorId: string;

@ManyToOne(() => User, (user) => user.userCourses)
creator: User;
用户类(class)字段解析器:
@FieldResolver(() => [Course], { nullable: true })
async userCourses(@Root() user: User, @Ctx() { courseLoader }: MyContext) {
const userCourses = await courseLoader.loadMany(user.userCourseIds);
return userCourses;
}

最佳答案

userCourses字段可以使用 @TypeormLoader 写成如下所示装饰器由 type-graphql-datalaoader 提供.

@ObjectType()
@Entity()
class User {
...

@Field((type) => [Course])
@OneToMany(() => Course, (course) => course.creator, { cascade: true })
@TypeormLoader((course: Course) => course.creatorId, { selfKey: true })
userCourses: Course[];
}

@ObjectType()
@Entity()
class Course {
...

@ManyToOne(() => User, (user) => user.userCourses)
creator: User;

@RelationId((course: Course) => course.creator)
creatorId: string;
}
userCourseIds 起不再发出其他查询被省略。虽然 creatorId@RelationId存在,它不会发出额外的查询,因为实体有它自己的值。
更新:2021 年 6 月 @TypeormLoader不再需要争论。因此 @RelationId如果愿意,可以完全省略。

关于express - 使用 type-graphql typeorm 和 dataloader 处理一对多的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63663128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com