Prisma - 如何在多个模型中定义由多个字段组成的复合唯一约束?

11
我在Prisma中有一个不太直观的模型关系,用户--< Enrollment >-- 课程,我无法确定如何确保仅在该用户创建的课程中课程标题字段是唯一的。换句话说,我不希望一个用户创建多个具有相同名称的课程。但是我希望拥有相同名称但由不同创建者创建的课程存在。(只有创建者在Enrollment中扮演TEACHER角色)。
我面临的问题是,我不知道在哪里定义唯一属性以及应包括哪些字段。我想对要设置唯一约束的字段(课程名称、具有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])
}
1个回答

31

你可能想在你的 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")
}

冗余插入成功。我猜是对每个单独的字段应用了约束。 - Mohsen
这是使字段组合唯一的解决方案: https://flaviocopes.com/prisma-multiple-fields-unique-key/ - Mohsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接