Prismaで同じテーブルに複数のリレーションを張る

ユーザーテーブルからポストテーブルに対して、

  • 記事を書いた人
  • 完成した記事をチェックした人

の2つのリレーションを張る方法を紹介します。

目次

いつも通り1対多のリレーションを複数張っても機能しない

以下のように通常通り1対多のリレーションを張ってもうまく機能しません。

model User {
  id String @id @default(cuid())

  posts Post[]
  checkedPosts   Post[]
}

model Post {
  id      String  @id @default(cuid())
  authorId  String
  checkedById String

  user  User @relation(fields: [authorId], references: [id], onDelete: SetNull)
  checkedBy User @relation(fields: [checkedById], references: [id], onDelete: SetNull)
}

リレーション元とリレーション先が曖昧になってしまうためです。

リレーションの両側にnameを付ける

以下のようにリレーションの両側の@relationに同じ名前をつけてあげるとうまく機能します。

model User {
  id String @id @default(cuid())

  posts Post[] @relation("Author")
  checkedPosts   Post[] @relation("CheckedPosts")
}

model Post {
  id      String  @id @default(cuid())
  checkedById  String
  authorId String

  user  User @relation("Author", fields: [authorId], references: [id], onDelete: SetNull)
  checkedBy User @relation("CheckedPosts", fields: [payerId], references: [id], onDelete: SetNull)
}

これでリレーションの曖昧がなくなって機能します。

参考

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

目次