以下の2通りの方法があります。
・A. 中間テーブルを明示的に定義する方法 ( explicit )
・B. 中間テーブルを定義せずおまかせで自動生成する方法 ( implicit )
中間テーブル CategoriesOnPosts を定義します。
命名は「2つのテーブルをアルファベット順に並べてToで繋げる。」 としておくと implicit の時と似た命名になります。
model Post {
id Int @id @default(autoincrement())
title String
categories CategoriesOnPosts[]
}
model Category {
id Int @id @default(autoincrement())
name String
posts CategoriesOnPosts[]
}
model CategoriesOnPosts {
post Post @relation(fields: [postId], references: [id])
postId Int // relation scalar field (used in the `@relation` attribute above)
category Category @relation(fields: [categoryId], references: [id])
categoryId Int // relation scalar field (used in the `@relation` attribute above)
assignedAt DateTime @default(now())
assignedBy String
@@id([postId, categoryId])
}
model Post {
id Int @id @default(autoincrement())
title String
categories Category[]
}
model Category {
id Int @id @default(autoincrement())
name String
posts Post[]
}
これで npx prisma migrate dev とすると
以下のような中間テーブル _CategoryToPostが自動生成されます。
命名は「2つのテーブルをアルファベット順に並べてToで繋げる。 先頭に_をつける」 で命名されます。
-- CreateTable
CREATE TABLE `_CategoryToPost` (
`A` INTEGER NOT NULL,
`B` INTEGER NOT NULL,
UNIQUE INDEX `_CategoryToPost_AB_unique`(`A`, `B`),
INDEX `_CategoryToPost_B_index`(`B`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;