前言

有时候我们查询的数据是一个链表查询的结果,示例如下:

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去获取结果。

注意PageDefaultArgsPageGetPayload都是通过定义的Page模型生成的对应方法,如果你的模型是User,那么名称也是需要对应变成:

UserDefaultArgs

UserGetPayload

通过这种方式我们能更加便捷的获取链表查询的结果,这样将结果传给entities实体类,也不用头疼类型不同的问题了。

分类: Nest.js 标签: 链表prismaNestjs查询链表类型

评论

暂无评论数据

暂无评论数据

目录