Skip to content

RDB で多対多のリレーションを記述する

一つ前の章 で扱ったアプリケーションに、「いいね」機能を実装してみましょう。

仕様はこんな感じです。

  • ユーザーは、ポストに「いいね」をつけれる。
  • ユーザーは、1 人あたり複数のポストにいいねをつけれる。
  • ポストは、 1 個あたり複数のユーザーがいいねをつけれる。

スキーマを定義する

SQL のデータベースに直接多対多 (n to m) のリレーションを記述することはできないため、ひと工夫しましょう。

liked (Liked) という「中間テーブル」を作成します。

model User {
id Int @id @default(autoincrement())
name String
createdPosts Post[]
liked Liked[]
}
model Post {
id Int @id @default(autoincrement())
creatorId Int
creator User @relation(fields: [creatorId], references: [id], onDelete: Cascade)
content String
likedBy Liked[]
}
model Liked {
likedById Int
likedBy User @relation(fields: [likedById], references: [id], onDelete: Cascade)
postId Int
post Post @relation(fields: [likedById], references: [id], onDelete: Cascade)
@@unique([likedById, postId])
}

取得する

では、ユーザーの id から、「ユーザーがいいねをつけたポスト」を取得してみましょう。

const user = await prisma.user.findUnique({
where: { id: 1 },
include: {
liked: {
select: {
post: true,
}
},
},
});