Prisma:具有三个引用可选字段的唯一索引字段的模型

Prisma: Model with three unique index fields referencing optional fields

我有一个关于具有可选值的唯一索引的问题。 我有这样的架构:

model Thread {
  id               Int            @id @default(autoincrement())
  createdAt        DateTime       @default(now())
  updatedAt        DateTime       @updatedAt
  body             String
  user             User           @relation(fields: [userId], references: [id])
  userId           Int
  likes            Like[]         @relation("ThreadsOnLikes")
}

model Like {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  user      User     @relation(fields: [userId], references: [id])
  userId    Int
  thread    Thread?   @relation("ThreadsOnLikes", fields: [threadId], references: [id])
  threadId  Int?
  comment   Comment? @relation("CommentsOnLikes", fields: [commentId], references: [id])
  commentId Int?

  @@unique([userId, threadId, commentId])
}

在解析器中,我想删除用户对特定 threadId 的点赞,如下所示:

await db.thread.update({
    where: { id: input.id },
    data: {
      likes: {
        delete: {
          userId_threadId_commentId: { userId: session.userId, threadId: input.id },
        },
      }
    }
  })

但是当我尝试执行该更改时,prisma 抛出以下错误: Argument commentId for data.likes.delete.userId_threadId_commentId.commentId is missing. 当我将它添加到带有 , commentId: null 的 delete 参数时,它会指出此错误: Argument commentId: Got invalid value null on prisma.updateOneThread. Provided null, expected Int. 尽管在数据库内部, comment_id 字段实际上是 null 。这是错误还是如何修复?

From the docs:

构成唯一约束的所有字段都必须是必填字段。以下模型无效,因为 id 可能为空:

model User {
  firstname Int
  lastname  Int
  id        Int?

  @@unique([firstname, lastname, id])
}

此行为的原因是所有连接器都认为空值是不同的,这意味着看起来相同的两行被认为是唯一的:

 firstname  | lastname | id
 -----------+----------+------
 John       | Smith    | null
 John       | Smith    | null

我不确定为什么 Prisma 无法在“编译时”预先验证架构,这可能是一个错误,所以我建议您在 Github?

上创建一个问题