Prisma中User与Lesson模型关联配置问题求助
Prisma模型关联配置:实现Lesson与User的关联查询
你当前用数组存关联ID的方式不符合Prisma的关联设计逻辑,要实现查询Lesson时直接拉取教练和参与用户的完整数据,需要设置一对多(教练-课程)和多对多(用户-参与课程)两种关联关系,修改后的schema如下:
datasource db { provider = "postgresql" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" } enum LessonState { ACTIVE CLOSED } model Lesson { id String @id @default(uuid()) @map("_id") @db.Uuid date DateTime @default(now()) subject String description String state LessonState @default(ACTIVE) // 课程关联对应的教练 coach User @relation("CoachLessons", fields: [coachId], references: [id]) coachId String @db.Uuid // 课程关联所有参与用户 participants User[] @relation("UserLessons") } enum UserRoles { ADMIN USER } model User { id String @id @default(uuid()) @map("_id") @db.Uuid name String surname String password String login String @unique birthDate DateTime role UserRoles @default(USER) createdAt DateTime @default(now()) // 反向关联:该用户作为教练带的所有课程 coachedLessons Lesson[] @relation("CoachLessons") // 反向关联:该用户参加的所有课程 lessonsAttended Lesson[] @relation("UserLessons") }
关键修改说明
教练关联(一对多)
- 删掉了原
coachId的@unique约束——一个教练可以带多门课,不需要唯一 - 用
@relation显式绑定Lesson的coachId到User的id,命名关系CoachLessons是为了和多对多关联区分开 - User里的
coachedLessons是反向关联,方便从用户端查询其带过的所有课程(不需要的话可以删掉,变成单向关联)
- 删掉了原
参与用户关联(多对多)
- 移除了原有的
usersIds数组字段——Prisma不推荐用数组存关联ID,会失去ORM的关联查询能力 - 通过双向的
participants和lessonsAttended定义多对多关系,Prisma会自动在PostgreSQL中创建中间表LessonUser,用来存储课程和用户的关联关系,无需手动建表
- 移除了原有的
查询示例
现在你可以直接查询课程,同时拉取教练和参与用户的完整数据:
const targetLesson = await prisma.lesson.findUnique({ where: { id: "你的课程ID" }, include: { coach: true, // 拉取教练信息 participants: true // 拉取所有参与用户信息 } });
关于单向关联
你提到倾向单向关联,其实Prisma支持单向关联,只需要去掉User中的反向关联字段即可。比如:
- Lesson中保留
coach User @relation(fields: [coachId], references: [id]),删掉User里的coachedLessons - Lesson中保留
participants User[],删掉User里的lessonsAttended
这样就变成从Lesson到User的单向关联,只是无法从User端直接查询关联的课程,如果不需要这个能力,完全可以这么做。
内容的提问来源于stack exchange,提问作者zerakot
相关产品推荐
相关产品推荐

