1:N 관계에서 N의 조건과 일치하는 여러 레코드(1) 반환하기

JH.P·2022년 4월 28일
0
  • 1 : N(CoffeeShop : categories) 의 관계를 가지고 있는 데이터 중, 특정 문자열로 시작하는 카테고리를 하나라도 가진 모든 CoffeeShop들을 반환해야하는 상황이다.
  • Prisma 공식 문서를 보고 해결하였다.
    https://www.prisma.io/docs/concepts/components/prisma-client/filtering-and-sorting
  • 해당 문서를 보면, categories는 여러 요소를 가진 배열이기 때문에 some 구문을 이용해야 한다고 힌트를 주고 있다.
const result = await prisma.user.findMany({
  where: {
    posts: {
      some: {
        views: {
          gt: 10,
        },
      },
    },
  },
})

이 코드를 해석해보면, 유저 모델에서 다수를 찾을 건데, 조건은 유저가 게시한 posts 중 조회수가 10개 이상인 유저들만 반환한다는 의미이다.
따라서 아래와 같이 작성하였다.

searchShops: (_, { keyword }) =>
  client.coffeeShop.findMany({
    where: {
      categories: {
        some: {
          name: {
            startsWith: `#${keyword}`,
          },
        },
      },
    },
  }),

이를 해석해보면 다수의 커피숍들을 반환할건데, 카테고리의 요소들 중 keyword로 시작하는 요소가 존재하는 커피숍들을 반환한다는 의미가 된다.

즉, 이 주제의 핵심은 1 : n 관계에서 배열의 요소 중 특정 조건에 일치하는 요소를 가진 레코드(1)를 찾으려면
n 관계에 있는 컬럼(categories)에 some을 이용하여 해당 모델의 이름(name)을 이용하여 조건(where)을 걸면 된다는 것이다.

profile
꾸준한 기록

0개의 댓글