Prisma で 多対多( Many to Many )リレーションの定義

● Prisma で 多対多( Many to Many )リレーションの定義

以下の2通りの方法があります。

・A. 中間テーブルを明示的に定義する方法 ( explicit )
・B. 中間テーブルを定義せずおまかせで自動生成する方法 ( implicit )

・A. 中間テーブルを明示的に定義する方法 ( explicit )

公式 : https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#explicit-many-to-many-relations

中間テーブル 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])
}

・B. 中間テーブルを定義せずおまかせで自動生成する方法 ( implicit )

公式 : https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations#implicit-many-to-many-relations

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;

参考 : Prisma Schemaの書き方あれこれ

No.2342
05/11 15:43

edit