如何在Prisma中使用Type内的ID创建UserWorkspace与Plan的关联
问题解决:Prisma中通过嵌套类型字段关联模型的方案
问题背景
使用Prisma时,需要在UserWorkspace和Plan模型间创建关联,但无法修改现有数据库结构。当前UserWorkspace的subscription是嵌套类型UserWorkspacesSubscription,其中包含planId(映射到数据库的plan字段),尝试用@relation(fields: [subscription.planId], references: [id])时报错,提示字段不存在,且无法在Type中添加关联。
解决方案
Prisma不支持直接引用嵌套类型内部的字段作为关联的外键字段,因此需要在UserWorkspace模型中单独声明一个与数据库plan字段映射的标量字段,用它来建立关联,同时保留原有的嵌套subscription类型。
修改后的模型代码如下:
type UserWorkspacesSubscription { date_end DateTime? @db.Date date_start DateTime? @db.Date planId String? @map("plan") @db.ObjectId } model UserWorkspace { id String @id @map("_id") @db.ObjectId // 新增:单独映射数据库的plan字段,用于关联逻辑 planId String? @map("plan") @db.ObjectId // 保留原嵌套类型,内部planId仍映射同一数据库字段 subscription UserWorkspacesSubscription? Exams Exam[] // 使用顶层planId字段建立关联 Plan Plan? @relation(fields: [planId], references: [id]) @@map("user_workspaces") } model Plan { id String @id @map("_id") @db.ObjectId UserWorkspaces UserWorkspace[] @@map("plans") }
关键说明
- 新增的顶层
planId和嵌套类型里的planId都映射到数据库的同一个plan字段,不会改变现有数据库结构,只是在Prisma模型层面做双重映射。 - 关联逻辑通过顶层
planId实现,符合Prisma的关联规则;同时嵌套类型subscription可正常使用,读写操作时两者会同步对应数据库的plan字段。
内容的提问来源于stack exchange,提问作者George Cosmin Taschina
相关产品推荐
相关产品推荐

