I'm Koala

I'm Koala

NextJS开发MealPlanner项目-05-复杂 Prisma 关系

5
2025-08-13

在Prisma中配置1对1、1对多、多对多的复杂数据表关系。

编辑prisma/schema.prisma文件,内容如下:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

// npx prisma init --datasource-provider sqlite --output ../generated/prisma => creates a new sqlite database
// npx prisma migrate dev => creates a new migration and applies it to the database
// npx prisma studio => opens Prisma Studio to view your data

generator client {
  provider = "prisma-client-js"
  output   = "../generated/prisma"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

model User {
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  password  String
  meal      Meal[]
  role      Role
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

enum Role {
  USER
  ADMIN
}

model Food {
  id              Int               @id @default(autoincrement())
  name            String            @unique
  calories        Float?
  protein         Float?
  fat             Float?
  carbohydrates   Float?
  fiber           Float?
  sugar           Float?
  category        Category?         @relation(fields: [categoryId], references: [id])
  categoryId      Int?
  foodServingUnit FoodServingUnit[]
  meal            Meal?             @relation(fields: [mealId], references: [id])
  mealId          Int?
  mealFood        MealFood[]
  createdAt       DateTime          @default(now())
  updatedAt       DateTime          @updatedAt
}

model Category {
  id        Int      @id @default(autoincrement())
  name      String   @unique
  foods     Food[]
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model ServingUnit {
  id              Int               @id @default(autoincrement())
  name            String            @unique
  foodServingUnit FoodServingUnit[]
  createdAt       DateTime          @default(now())
  updatedAt       DateTime          @updatedAt
  mealFood        MealFood[]
}

model FoodServingUnit {
  id            Int         @id @default(autoincrement())
  name          String      @unique
  food          Food        @relation(fields: [foodId], references: [id])
  foodId        Int
  servingUnit   ServingUnit @relation(fields: [servingUnitId], references: [id])
  servingUnitId Int
  grams         Float?
  createdAt     DateTime    @default(now())
  updatedAt     DateTime    @updatedAt
}

model Meal {
  id        Int        @id @default(autoincrement())
  date      DateTime
  foods     Food[]
  user      User       @relation(fields: [userId], references: [id])
  userId    Int
  createdAt DateTime   @default(now())
  updatedAt DateTime   @updatedAt
  mealFood  MealFood[]
}

model MealFood {
  id            Int         @id @default(autoincrement())
  food          Food        @relation(fields: [foodId], references: [id])
  foodId        Int
  meal          Meal        @relation(fields: [mealId], references: [id])
  mealId        Int
  servingUnit   ServingUnit @relation(fields: [servingUnitId], references: [id])
  servingUnitId Int
  amount        Float
  createdAt     DateTime    @default(now())
  updatedAt     DateTime    @updatedAt
}

编辑完成后,由于修改的数据表内容过多,影响到migration生成,为了简单处理,直接在命令行执行如下命令,强制重置Prisma的Migration。

npx prisma db push --force-reset

  • 0