Home  >  Q&A  >  body text

Prisma room management system

I'm trying to create a database for a room management system but I'm confused about the relationships and can't find any useful resources on the internet, can you tell me if there's something wrong with this prisma script? Because I want to control it in expressJs and make an app based on it

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
}

I tried creating a rough one for each entity, but ended up getting relationship errors, like foreign keys or something, which meant there was something wrong with my relationship.

P粉819937486P粉819937486186 days ago416

reply all(1)I'll reply

  • P粉037450467

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

    Your schema is valid, but I recommend maintaining consistency when defining ids for tables. Some table IDs are string types, and some table IDs are numeric types.

    The following is an example query to create entities for the model.

    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();
      });
    
    

    This is the query response:

    > 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

    reply
    0
  • Cancelreply