Prisma中获取链表查询的类型
前言
有时候我们查询的数据是一个链表查询的结果,示例如下:
const pageData = await this.prisma.page.findUnique({
where: {
id,
deletedAt: null
},
include: {
categories: {
where: {
deletedAt: null
},
include: {
bookmarks: {
where: {
deletedAt: null
},
include: {
gallery: true
}
}
}
}
}
});
但是prisma默认导出的模型是各自独立的结果,是不会如同上述查询的结果类型,为此我们需要自己组合一下:
import type { Page, Category, Bookmark, Gallery } from "@prisma/client"
type PageDataType = Page & {
categories: Array<
Category & {
bookmarks: Array<
Bookmark & {
gallery: Gallery;
}
>;
}
>;
};
虽然说凑合着也能用,但是有没有更加优雅一点的方式?
当然是有的。
教程
prisma官方提供了一个命名空间Prisma
,这个命名空间上挂载了一些工具方法,我们可以利用他们实现我们的效果。
import { Prisma } from "@prisma/client";
/** 分页详情数据查询条件 */
const pageDetailWithArgs = Prisma.validator<Prisma.PageDefaultArgs>()({
include: {
categories: {
include: {
bookmarks: {
include: {
gallery: true
}
}
}
}
}
});
/** 分页详情数据类型 */
export type PageDetailType = Prisma.PageGetPayload<typeof pageDetailWithArgs>;
首先我们定义一个pageDetailWithArgs
查询条件参数,然后通过Prisma.PageGetPayload
去获取结果。
注意PageDefaultArgs
和PageGetPayload
都是通过定义的Page模型生成的对应方法,如果你的模型是User
,那么名称也是需要对应变成:
UserDefaultArgs
UserGetPayload
通过这种方式我们能更加便捷的获取链表查询的结果,这样将结果传给entities实体类,也不用头疼类型不同的问题了。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据