TIL | [Prisma] 선택한 데이터를 제외하는 방법

bubblegum·2024년 2월 27일
0

Today I learn(TIL)

목록 보기
26/84
post-thumbnail

예약하려고 하는 일자를 선택하면 해당 일시에 일정이 비어있는 펫시터를 조회하려고 한다. 단, 예약은 "일" 단위이기 때문에 하루 중 조금이라도 예약이 잡혀있다면 그 펫시터는 예약이 불가능하므로 펫시터 목록 조회에서 제외해야 한다.

where 절에서 NOT을 사용하여 해당 '일시'에 예약이 잡혀있는 모든 펫시터들을 제외할 수 있었다. 그러나 일시가 함께 조회되므로 특정 시간을 제외한 모든 펫시터가 조회되는 문제가 있다.

findTrainersNoDate = async (date) => {
    const noReservation = await this.prisma.trainers.findMany({
      where: {
        NOT: {
          reservations: {
            some: {
              startDate: date,
            },
          },
        },
      },
      select: {
        trainerId: true,
        users: { select: { name: true } },
        petCategory: true,
        price: true,
        career: true,
      },
    });

    return noReservation;
  };

따라서, 시간을 고려하지 않고 특정 일자의 예약 정보를 모두 조회하려면 해당 일자의 시작과 끝을 포함하는 범위를 설정하여 검색해야 한다. 예를 들어, 특정 일자인 '2024-02-25'를 기준으로 00:00:00부터 23:59:59까지의 범위를 설정하여 해당 범위 내에 시작 날짜 또는 종료 날짜가 포함되는 예약 정보를 조회할 수 있다.

SQL에서는 다음과 같은 방법으로 쿼리를 작성할 수 있다:

SELECT *
FROM reservations
WHERE startDate <= '2024-02-25 23:59:59' AND endDate >= '2024-02-25 00:00:00';

위의 쿼리는 '2024-02-25'를 기준으로 시작 날짜가 해당 날짜보다 이전이고 종료 날짜가 해당 날짜보다 이후인 모든 예약 정보를 반환한다.

Prisma를 사용하는 경우에도 비슷한 방식으로 쿼리를 작성할 수 있다. 예를 들어:

const reservations = await prisma.reservations.findMany({
  where: {
    AND: [
      { startDate: { lte: '2024-02-25T23:59:59Z' } },
      { endDate: { gte: '2024-02-25T00:00:00Z' } }
    ]
  }
});

위의 코드는 Prisma를 사용하여 시작 날짜가 '2024-02-25 23:59:59'보다 이전이고 종료 날짜가 '2024-02-25 00:00:00'보다 이후인 모든 예약 정보를 반환한다. 이렇게하면 시간을 고려하지 않고 해당 일자의 예약 정보를 모두 조회할 수 있다.

바디에서 일자를 선택할 때 시작일자와 종료일자를 받아와서 서비스 계층에서 시간을 위와 같이 가공하여 전달해주면 될 듯하다.

profile
황세민

0개의 댓글

관련 채용 정보