我想在schema.prisma文件中创建一个Json?
类型的字段,但我想将其Map到TypeGraphQL @ObjectType()
类。我不想在数据库中为该对象创建一个表。我想将其作为json存储在db中,但我想确保它符合我在gql模式中定义的类型。这可能吗?我没有使用typegraphql-prisma
包。下面是一个简化的示例(这里的代码可能不完美,因为我无法复制/粘贴):
schema.prisma.comments
中只有一个表是Json
类型,而不是定义与Comment
模型/表的一对多关系。
schema.prisma
model Post {
id Int @id @default(autoincrement())
title String
content String
comments Json?
}
但是在我的TypeGraphQL类型中,我想定义组成Comment
的属性。我不想将comments
定义为Prisma.JsonValue
。我希望它是一个类似Comment[]
的列表。
types.ts
@ObjectType()
export class Comment {
@Field()
id!: number;
@Field()
content!: string;
}
@ObjectType()
export class Post {
@Field()
id!: number;
@Field()
title!: string;
@Field()
content!: string;
@Field((type) => [Comment], { nullable: true })
comments?: Comment[] | null;
}
当我尝试查询时,我会收到不同的TypeScript错误,这取决于我尝试的不同操作。它不喜欢我在Prisma模型中使用JSON,而在comments
的类型定义中使用对象。是否可以用这种方式定义我的数据库和类型?在对象和JSON之间“转换”的最佳方式是什么?谢谢!
import { Post as PostDb } from '@prisma/client';
import { Post } from './types.ts';
@Resolver(Post)
export class PostResolver {
@Query((returns) => Post, { nullable: true })
async getPostByTitle(title: string): Promise<PostDb | null> {
try {
return prismaClient.post.findUnique({
where: { title }
});
} catch(error) {
throw new GetPostError(error.message);
}
}
}
1条答案
按热度按时间aiazj4mn1#
目前,据我所知,您必须使用
class-transformer
将普通的JSON
转换为 type-graphqlclass
的示例。Comment
类添加
Expose
装饰器,启用excludeExtraneousValues
的使用:当将普通值转换为类时,应该从值中排除无关的属性。PostResolver
类只要找到
Prisma
Post类,就使用实用函数mapPost
将其Map到type-graphql
类示例。注意,对于每个
JSON
注解,我们使用class-transformer
库中的函数plainToInstance
将其转换为(type-graphql)Comment
类的示例。示例
假设您已将JSON
Comment
保存为:现在您应该能够执行以下查询:
得到如下结果: