🌸 GraphQL

Prisma Client 필터링

ji-hyun 2022. 4. 4. 08:33

대다 관계 필터

Prisma Client는 관계의 "대다" 측면에서 관련 레코드의 속성으로 레코드를 필터링 하는 some, every, none 및 옵션을 제공합니다. 

예를 들어, 게시물의 속성을 기반으로 사용자를 필터링합니다.

 

 

 

 

RequirementQuery / option to use

 

"I want a list of every User that has at least one unpublished Post record" some posts are unpublished
"I want a list of every User that has no unpublished Post records" none of the posts are unpublished
"I want a list of every User that has only unpublished Post records" every post is unpublished

 

 

 

예를 들어, 다음 쿼리는 User 다음 기준을 충족하는 결과를 반환합니다.

 

  • 조회수가 100회 이상인 게시물이 없습니다.
  • 모든 게시물에 좋아요가 50개 이하입니다.

 

 

const users = await prisma.user.findMany({
  where: {
    posts: {
      none: {
        views: {
          gt: 100,
        },
      },
      every: {
        likes: {
          lte: 50,
        },
      },
    },
  },
})

 

 

 

 

 

 

 

 

"일대일" 관계 필터링

Prisma Client는 관계의 "일대일" 측에서 관련 레코드의 속성으로 레코드를 필터링 하는 is isNot 옵션을 제공합니다. 예를 들어 작성자의 속성을 기반으로 게시물을 필터링합니다.

 

 

예를 들어 다음 쿼리는 다음 기준을 충족하는 레코드 Post 를 반환합니다.

  • 작성자 이름은 Bob이 아닙니다.
  • 작성자는 40세 이상입니다.
 
 
  const users = await prisma.post.findMany({
    where: {
      author: {
        isNot: {
          name: "Bob"
        },
        is: {
          age: {
            gt: 40
          }
        }
      }
    }
  },
})

 

 

 

 

 

 

 

 

 

 

관계 수로 필터링하는 것은 아직 지원되지 않습니다. 그러나 레코드에 관련 레코드가 있는지 여부를 필터링할 수 있습니다. 예를 들어 다음 쿼리는 none게시물이 없는 모든 사용자를 반환하는 데 사용합니다.

 

const usersWithZeroPosts = await prisma.user.findMany({
  where: {
    posts: {
      none: {},
    },
  },
})

 

 

 

 

다음 쿼리는 하나 이상의 게시물이 있는 모든 사용자를 반환합니다.

 

const usersWithSomePosts = await prisma.user.findMany({
  where: {
    posts: {
      some: {},
    },
  },
})

 

 

 

 

 

 

 

 

 

응용 

 

const result = await prisma.user.findMany({
  where: {
    email: {
      endsWith: 'prisma.io',
    },
    posts: {
      some: {
        published: true,
      },
    },
  },
  include: {
    posts: {
      where: {
        published: true,
      },
    },
  },
})

 

where: Post 는 적어도 하나 이상 true 인 레코드를 가진 USER 를 필터하기

 

 

 

 

 

 

 

 

추가로 in 도 정리

 

 const ret = await prisma.signe.findMany({
            where: {
                id: { in: [1, 2, 12] },
            }
        })

 

 

 

 

 

const storeDataCount = await prismaRO.store.count({
	where: {
    		service: { some: { id: { in: service } } }
    }
});

 

where 절: store 의 service 필드  기준

service 필드에서 some 있으므로 다대 관계로 필터함을 의미

service 안의 id 필드와 필터

id 가 적어도 하나있는 서비스를 필터하기. 

 

 

 

 

 

 

const getUser = await prisma.user.findMany({
  where: {
    // Find users where..
    posts: {
      some: {
        // ..at least one (some) posts..
        categories: {
          some: {
            // .. have at least one category ..
            name: {
              in: ['Food', 'Introductions'], // .. with a name that matches one of the following.
            },
          },
        },
      },
    },
  },
})