【问题标题】:How to create one to many relationship from many to many join table in Prisma如何在 Prisma 中创建多对多连接表的一对多关系
【发布时间】:2022-01-17 11:57:04
【问题描述】:

我正在创建一个锻炼应用程序,并希望对用户和锻炼计划之间的关系进行建模。一个用户可以多次创建一个程序。

这是我的 Prisma 模型:

model User {
  id                      Int         @id @default(autoincrement())
  createdAt               DateTime    @default(now())
  email                   String      @unique
  firstName               String      @db.VarChar(50)
  lastName                String      @db.VarChar(50)
  password                String      @db.VarChar(191)
  
  programs                ProgramEnrollment[]
  
}

model ProgramEnrollment {
  program                 Program     @relation(fields: [programId], references: [id])
  programId               Int // relation scalar field (used in the `@relation` attribute above)
  user                    User @relation(fields: [userId], references: [id])
  userId                  Int // relation scalar field (used in the `@relation` attribute            
  assignedAt              DateTime @default(now())

  @@id([programId, userId])
}

model Program {
  id                    Int                 @id @default(autoincrement())
  name                  String   
  users                 ProgramEnrollment[]
}

上面的效果很好,但是现在我想做的是让用户记录他们的个人程序结果,所以我添加了以下内容:

model ProgramEnrollment {
  program                 Program     @relation(fields: [programId], references: [id])
  programId               Int // relation scalar field (used in the `@relation` attribute above)
  user                    User @relation(fields: [userId], references: [id])
  userId                  Int // relation scalar field (used in the `@relation` attribute            
  assignedAt              DateTime @default(now())
  userProgram             UserProgram[] 

  @@id([programId, userId])
}

model UserProgram {
  id                        Int                 @id @default(autoincrement())
  name                      String

  userProgramEnrollment     ProgramEnrollment @relation(fields: [programEnrollmentId], references: [id])
  programEnrollmentId       Int // relation scalar field (used in the `@relation` attribute above)
} 

当我进行上述更改时,我收到以下错误:验证错误:参数references 必须仅引用相关模型ProgramEnrollment 中的现有字段。相关模型中不存在以下字段:id

为什么不允许我从多对多连接表创建一对多关系?

【问题讨论】:

    标签: mysql database database-design prisma


    【解决方案1】:

    As docs states 复合 ID (@@id) 无法在关系字段上定义。

    您可能可以使用 @@uniquedefine a compound unique constraint 代替,例如:@unique([programId, userId]),然后只需为 ProgramEnrollment 使用常规自动生成的 id,然后您就可以在 UserProgram 的关系中使用它

    【讨论】:

      【解决方案2】:

      我只需要稍微调整一下 UserProgram 模型以考虑 ProgramEnrollment 模型中的多字段 id。

      model ProgramEnrollment {
        program                 Program     @relation(fields: [programId], references: [id])
        programId               Int // relation scalar field (used in the `@relation` attribute above)
        user                    User        @relation(fields: [userId], references: [id])
        userId                  Int // relation scalar field (used in the `@relation` attribute            
        assignedAt              DateTime    @default(now())
        userProgram             UserProgram[] 
      
        @@id([programId, userId])
      }
      
      model UserProgram {
        id                           Int                 @id @default(autoincrement())
        name                         String
        userProgramEnrollment        ProgramEnrollment @relation(fields: [programEnrollment_programId,  programEnrollment_userId], references: [programId, userId])
        programEnrollment_programId  Int
        programEnrollment_userId     Int 
      } 
      

      由于 ProgramEnrollment 使用两个字段作为其 id,我们必须在 UserProgram 模型中引用这两个字段。

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 2022-01-27
        • 2021-07-25
        • 2022-01-08
        • 1970-01-01
        • 2022-10-25
        • 2022-01-19
        • 2021-09-17
        • 1970-01-01
        相关资源
        最近更新 更多