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?
}