如何在Prisma中自动生成包含关联关系的完整类型?
如何在Prisma中自动生成包含关联关系的完整类型?
嘿,我之前也被这个问题卡过!默认情况下Prisma生成的基础模型类型确实只带模型自身的字段,就像你给出的示例里,Order的默认类型只有id和userId,完全没包含user和payments这些关联字段。不过别担心,有几个简单又实用的方法能解决这个问题:
先把你提供的模型示例贴出来,方便大家对照参考:
model Order { id String @id @default(uuid()) @db.Uuid userId String @db.Uuid user User? @relation(fields: [userId], references: [id]) payments Payment[] } model Payment { id String @id @default(uuid()) @db.Uuid orderId String @db.Uuid order Order @relation(fields: [orderId], references: [id]) }
方法一:用Prisma内置的Prisma.GetPayload类型助手
Prisma本身就自带了专门的类型工具,能帮你提取包含关联的完整类型,用法超直接:
import { Prisma } from '@prisma/client'; // 生成包含user和payments关联的Order类型 type OrderWithRelations = Prisma.GetPayload<{ model: Prisma.OrderModel, include: { user: true, payments: true } }>;
现在这个OrderWithRelations类型就包含了id、userId,以及关联的user(可选User类型)和payments(Payment数组)字段,完全符合你要的完整结构。
方法二:从实际查询的返回类型推导
如果你代码里已经有固定的关联查询逻辑(比如经常用include拉取关联数据),可以直接提取这个查询的返回类型,不用手动写include配置:
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); // 先定义带关联查询的函数 async function fetchFullOrder(orderId: string) { return prisma.order.findUnique({ where: { id: orderId }, include: { user: true, payments: true } }); } // 提取函数的返回类型,Awaited用来处理Promise包装的类型 type OrderWithRelations = Awaited<ReturnType<typeof fetchFullOrder>>;
这种方式的好处是,要是你后续修改了查询里的include配置,类型会自动跟着更新,不用手动调整类型定义,省了不少麻烦。
方法三:创建全局可用的自定义类型
如果项目里很多地方都要用到带关联的类型,建议在项目里建一个专门的类型文件(比如src/types/prisma-custom.ts),把常用的带关联类型都集中定义在这里:
import { Prisma } from '@prisma/client'; // 带完整关联的Order类型 export type OrderWithFullRelations = Prisma.GetPayload<{ model: Prisma.OrderModel, include: { user: true, payments: true } }>; // 带关联Order的Payment类型 export type PaymentWithOrder = Prisma.GetPayload<{ model: Prisma.PaymentModel, include: { order: true } }>;
之后在任何需要的地方直接导入这些类型就行,维护起来特别省心。
最后提醒一句:不管用哪种方法,只要你修改了Prisma Schema文件,记得跑一下npx prisma generate重新生成客户端,这样所有的类型都会同步更新哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

