首頁  >  問答  >  主體

Prisma 的房間管理系統

我試圖為房間管理系統建立一個資料庫,但我對這些關係感到困惑,並且在網路上找不到有用的資源,你能告訴我這個 prisma 腳本是否有問題嗎?因為我想在expressJs中控制它並基於它製作一個應用程式

generator client {
  provider = "prisma-client-js"
}

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

model Guest {
  guestId     String        @id @default(uuid())
  name        String
  phone       String        @unique()
  address     String?
  nationality String
  Reservation Reservation[] @relation("GuestReservation")
}

model Reservation {
  reservationId Int             @id @default(autoincrement())
  checkIn       DateTime
  checkOut      DateTime
  Guest         Guest           @relation("GuestReservation", fields: [guestId], references: [guestId], onDelete: Cascade)
  guestId       String
  visitors      Int
  Room          Room            @relation("RoomReservation", fields: [roomId], references: [roomId], onDelete: Cascade)
  type          ReservationType
  roomId        Int
  Bill          Bill?           @relation("BillReservation")
}

enum ReservationType {
  Booking
  Contract
  Booked
  Canceled
}

model Room {
  roomId      Int           @id @default(autoincrement())
  price       Float
  type        Type
  Reservation Reservation[] @relation("RoomReservation")
}

enum Type {
  Single
  Double
  Triple
}

model Bill {
  invoiceNo     String      @id @default(uuid())
  Reservation   Reservation @relation("BillReservation", fields: [reservationId], references: [reservationId], onDelete: Cascade)
  reservationId Int         @unique()
  roomService   Float       @default(0)
  paymentMode   Payment
  Service       Service[]
}

enum Payment {
  Cash
  Visa
}

model Service {
  serviceId     String      @id @default(uuid())
  type          ServiceType
  name          String
  price         Float
  Bill          Bill        @relation(fields: [billInvoiceNo], references: [invoiceNo], onDelete: Cascade)
  billInvoiceNo String
}

enum ServiceType {
  Bar
  Laundry
}

我嘗試為每個實體創建一個粗略的內容,但最終出現了關係錯誤,例如外來密鑰之類的東西,這意味著我的關係有問題。

P粉819937486P粉819937486186 天前413

全部回覆(1)我來回復

  • P粉037450467

    P粉0374504672024-03-31 00:31:33

    您的架構是有效的,但我建議在為表定義 id 時保持一致性。有些表的id是字串類型,有些表的id是數字類型。

    以下是為模型建立實體的查詢範例。

    import {
      PrismaClient,
      Type,
      ServiceType,
      Payment,
      ReservationType,
    } from '@prisma/client';
    
    const prisma = new PrismaClient({
      log: ['query'],
    });
    
    async function main() {
      // Creating a room
      await prisma.room.create({
        data: {
          price: 100,
          type: Type.Single,
          roomId: 1,
        },
      });
    
      // Creating a guest
      await prisma.guest.create({
        data: {
          name: 'Test',
          nationality: 'Indian',
          phone: '1234567890',
          address: 'Test Address',
          guestId: '1',
        },
      });
    
      // Creating a service with a bill and a reservation
      await prisma.service.create({
        data: {
          name: 'test',
          price: 100,
          type: ServiceType.Bar,
          serviceId: '1',
          Bill: {
            create: {
              paymentMode: Payment.Cash,
              invoiceNo: '1',
              Reservation: {
                create: {
                  checkIn: new Date(),
                  checkOut: new Date(),
                  type: ReservationType.Booked,
                  visitors: 1,
                  roomId: 1,
                  guestId: '1',
                },
              },
            },
          },
        },
      });
    }
    
    main()
      .catch((e) => {
        throw e;
      })
      .finally(async () => {
        await prisma.$disconnect();
      });
    
    

    這是查詢回應:

    > ts-node index.ts
    prisma:query BEGIN
    prisma:query INSERT INTO `white_egret`.`Room` (`roomId`,`price`,`type`) VALUES (?,?,?)
    prisma:query SELECT `white_egret`.`Room`.`roomId`, `white_egret`.`Room`.`price`, `white_egret`.`Room`.`type` FROM `white_egret`.`Room` WHERE `white_egret`.`Room`.`roomId` = ? LIMIT ? OFFSET ?
    prisma:query COMMIT
    prisma:query BEGIN
    prisma:query INSERT INTO `white_egret`.`Guest` (`guestId`,`name`,`phone`,`address`,`nationality`) VALUES (?,?,?,?,?)
    prisma:query SELECT `white_egret`.`Guest`.`guestId`, `white_egret`.`Guest`.`name`, `white_egret`.`Guest`.`phone`, `white_egret`.`Guest`.`address`, `white_egret`.`Guest`.`nationality` FROM `white_egret`.`Guest` WHERE `white_egret`.`Guest`.`guestId` = ? LIMIT ? OFFSET ?
    prisma:query COMMIT
    prisma:query BEGIN
    prisma:query INSERT INTO `white_egret`.`Reservation` (`reservationId`,`checkIn`,`checkOut`,`guestId`,`visitors`,`type`,`roomId`) VALUES (?,?,?,?,?,?,?)
    prisma:query INSERT INTO `white_egret`.`Bill` (`invoiceNo`,`reservationId`,`roomService`,`paymentMode`) VALUES (?,?,?,?)
    prisma:query INSERT INTO `white_egret`.`Service` (`serviceId`,`type`,`name`,`price`,`billInvoiceNo`) VALUES (?,?,?,?,?)
    prisma:query SELECT `white_egret`.`Service`.`serviceId`, `white_egret`.`Service`.`type`, `white_egret`.`Service`.`name`, `white_egret`.`Service`.`price`, `white_egret`.`Service`.`billInvoiceNo` FROM `white_egret`.`Service` WHERE `white_egret`.`Service`.`serviceId` = ? LIMIT ? OFFSET ?
    prisma:query COMMIT

    回覆
    0
  • 取消回覆