我想在我的Json?
文件中创建一个Json?
类型的字段,但是我想将它映射到一个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错误。它不喜欢我用JSON作为我的Prisma模型,用对象来定义我的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);
}
}
}
发布于 2022-10-04 14:39:50
目前,据我所知,您必须使用将普通的JSON
转换为类型-graphql class
的实例。
Comment
类
添加Expose
装饰符,允许使用excludeExtraneousValues
:当将普通值转换为类时,应从值中排除无关属性。
// ...
import { Expose } from 'class-transformer';
@ObjectType()
export class Comment {
@Field()
@Expose()
id!: number;
@Field()
@Expose()
content!: string;
}
PostResolver
类
每当找到Prisma
Post类时,使用实用程序函数mapPost
将其映射到type-graphql
类实例。
注意,对于每个JSON
注释,我们使用函数plainToInstance
从class-transformer
库将其转换为(type-graphql) Comment
类的实例。
// ...
import type { Prisma, Post as PrismaPost } from '@prisma/client';
import { plainToInstance } from 'class-transformer';
@Resolver(Post)
export class PostResolver {
/**
* Map an instance of a Prisma Post class to
* an instance of a type-graphql class.
*
* @param post - Prisma Post class instance
* @returns type-graphql Post class instance
*/
private mapPost(post: PrismaPost): Post {
return {
...post,
comments: post.comments
? (post.comments as Prisma.JsonArray).map((comment) =>
plainToInstance(Comment, comment, { excludeExtraneousValues: true })
)
: null
};
}
@Query(() => Post, { nullable: true })
async getPostByTitle(title: string): Promise<Post | null> {
try {
const post = prismaClient.post.findUnique({
where: { title }
});
// Return null if post not found
if (!post) return null;
// Found! Map from Prisma to type-graphql
return this.mapPost(post);
} catch(error) {
throw new GetPostError(error.message);
}
}
}
示例
假设您将JSON Comment
保存为:
[
{
"id": 0,
"content": "Hello"
},
{
"id": 1,
"content": "World"
}
]
现在您应该能够执行以下查询:
getPostByTitle(title: "Hello World") {
id,
comments {
content
}
}
取得以下结果:
{
"data": {
"getPostByTitle": {
"id": 0,
"comments": [
{
"content": "Hello"
},
{
"content": "World"
}
]
}
}
}
https://stackoverflow.com/questions/73914625
复制相似问题