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

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

・呼び出す側(メインとなるモデル)

model User {
  id      Int      @id @default(autoincrement())
  profile Profile?
}

・呼び出される側(サブとなるモデル)

model Profile {
  id     Int  @id @default(autoincrement())
  user   User @relation(fields: [userId], references: [id])
  userId Int  @unique // relation scalar field (used in the `@relation` attribute above)
}

https://bit.ly/3Ok87XZ

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

model User {
  id    Int    @id @default(autoincrement())
  posts Post[]
}

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

● 設定項目

・親テーブルを削除したときに関連テーブルも同時に削除する onDelete: Cascade

model Post {
  id       Int  @id @default(autoincrement())
  author   User @relation(fields: [authorId], references: [id] , onDelete: Cascade) // 追加
  authorId Int
}

● 1対多( One to Many )リレーションの書き方のコツ

・1. まずこのようにidだけを定義したそれぞれのモデルを作成しておきます。

model User {
  id    Int    @id @default(autoincrement())
}

model Post {
  id       Int  @id @default(autoincrement())
}

・2. 親がわ(1対多の多 側)にリレーションを追記して保存します。

model User {
  id    Int    @id @default(autoincrement())
  posts Post[] // ● ← 追記
}

model Post {
  id       Int  @id @default(autoincrement())
}

・3. すると、子がわに自動で追記されます。

model User {
  id    Int    @id @default(autoincrement())
  posts Post[]
}

model Post {
  id       Int  @id @default(autoincrement())
  user   User @relation(fields: [userId], references: [id])  // ● 自動
  userId Int  // ● 自動
}

あとは フィールド名やデータベースの物理カラム名など書き加えます。

● 1対多( One to Many )リレーションでSELECT時にリレーションも取得する

・include (全てのフィールドをとる場合)

const user = await this.prisma.user.findUnique({
  where: { email: email },
  include: { posts: true },
})

・select (指定したカラムのみ取得する場合)

const user = await this.prisma.user.findUnique({
  where: { email: email },
  select: {
    id: true,
    email: true,
    posts: {
      select:{
        id: true,
      }
    }
  },
})
No.2346
12/28 19:08

edit