1レコードが1テーブルから複数のリレーションを持つ方法。

サンプル

これは以下のPrismaの公式ドキュメントにあるサンプルです。

投稿データのPostテーブルがあり、投稿データは投稿者(author)と投稿固定者(pinnedBy)を持ち、それぞれがユーザーテーブルへのリレーションとなっています。

model User {
  id           Int     @id @default(autoincrement())
  name         String?
  writtenPosts Post[]  @relation("WrittenPosts")
  pinnedPost   Post?   @relation("PinnedPost")
}

model Post {
  id         Int     @id @default(autoincrement())
  title      String?
  author     User    @relation("WrittenPosts", fields: [authorId], references: [id])
  authorId   Int
  pinnedBy   User?   @relation("PinnedPost", fields: [pinnedById], references: [id])
  pinnedById Int?    @unique
}

Postテーブルは、カラムautherId とpinnedById を持ち、これらはUserテーブルへの外部キー制約を持ちます。 どちらもUserテーブルのカラムidへのリレーションとなります。 この場合、参照先を明確にする必要があるため、@relationに参照先を区別するユニークな名称を指定します。

間違った例

以下は参照先が曖昧になる間違ったサンプルです。これは npx prisma formatコマンドでエラーになります。

model User {
  id           Int     @id @default(autoincrement())
  name         String?
  writtenPosts Post[]
  pinnedPost   Post?
}

model Post {
  id         Int     @id @default(autoincrement())
  title      String?
  author     User    @relation(fields: [authorId], references: [id])
  authorId   Int
  pinnedBy   User?   @relation(fields: [pinnedById], references: [id])
  pinnedById Int?
}