Prisma - 如何使用多个模型中的字段定义复合唯一约束?

问题描述

我在 prisma 中有这种不那么简单的模型关系。用户 ---- 课程,我不知道如何确保课程标题字段在该用户创建的课程中是唯一的。换句话说,我不希望一个用户创建多个同名的课程。但我希望课程与不同的创作者同名。 (只有创建者在 Enrollment 中具有 TEACHER 角色)

我面临的问题是,我不知道在哪里定义唯一属性以及要包含哪些字段。我想对其进行唯一约束的字段(课程名称、具有教师角色的成员)跨不同模型。

model User {
  id                Int              @id @default(autoincrement())
  email             String           @unique
  passwordHash      String
  enrollments       Enrollment[]
}

model Course {
  id                Int              @id @default(autoincrement())
  name              String
  members           Enrollment[]
}

model Enrollment {
  role              UserRole         @default(STUDENT)

  // Relation Fields
  userId            Int
  courseId         Int
  user              User             @relation(fields: [userId],references: [id])
  course           Course          @relation(fields: [courseId],references: [id])
  @@id([userId,courseId])
  @@index([userId,role])
}

解决方法

您可能希望在您的 Course 模型上添加一个字段来定义它的创建者,以便您可以将该字段用作表本身的唯一约束。

model Course {
  id                Int              @id @default(autoincrement())
  name              String
  members           Enrollment[]
  creatorId         Int
  creator           User             @relation(fields: [creatorId],references: [id])
  @@unique([creatorId,name],name: "courseIdentifier")
}