Prisma

21.11.11 pagination

슈팅스타제제 2021. 11. 12. 13:29

 

const followers = await client.use
  .findUnique({where: username})
  .followers({
    take: 5, 
    skip: (page - 1) * 5
  })

skip/take 

const results = await prisma.post.findMany({
  skip: 3, 
  take: 4
})

findMany를 사용해 posts들을 불러온다. 

앞에서부터 3가지 post를 skip한다. //skip은 생략하는 데이터 갯수

skip된 post 직후의 4개의 post를 취한다. //take는 가져올 데이터 갯수

 

skip/take는 순서에 상관없이 페이지네이션이 이루어진다. 

 

- offset pagination: 맨 앞에서부터 몇 개 skip하고 몇 개 가져오기

const results = await prisma.post.findMany({
  skip: 5, 
  take: 5,
})

5개를 skip하고 5개를 표시한다. 

const results = await prisma.post.findMany({
  skip: 10, 
  take: 5,
})

10개를 skip하고 5개를 표시해준다. 

내가 클릭한 페이지를 page에 담아서 이동한다면,

const result = await prisma.post.findMany({
  skip: (page - 1) * 5,
  take: 5,
})

 page 1일 때는 skip 하지 않고

2일 때는 5개 skip

3일 때는 10개 skip 

 

- cursor-based pagination: 마지막 cursor가 있었던 위치부터 skip하고 몇 개 가져오기

const results = await prisma.post.findMany({
  take: 4, 
  skip: 1, 
  cursor: {id: lastId}
})

cursor input 인자로 들어온 마지막 id 29번째 데이터를 기준으로 1개를 skip하고 4개를 가져온다. 

근데 cursor를 내리지 않는 (lastId가 없는) 상황에서도 마지막 1개의 데이터는 skip 된다.

const results = await prisma.post.findMany({
  take: 4, 
  //lastId의 존재 여부에 따라 skip 할 수도 안할 수도 있다. 
  skip: lastId ? 1 : 0,
  //spead 연산자는 데이터의 원본을 복사해서 갖고 온다. 
  ...(lastId && {cursor:{id: lastId}})
})

 

...(lastId && {cursor:{id: lastId}})는 입력된 값이 있을 때만 cursor에 id값으로 데이터를 넣어주는 역할을 한다. 

 

참고 문서 링크 

1. 공식 문서 

https://www.prisma.io/docs/concepts/components/prisma-client/pagination

2. 블로그 글

https://velog.io/@mgk8609/Prisma%EB%A1%9C-Pagination-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

'Prisma' 카테고리의 다른 글

22.01.09 select fields(정리중)  (0) 2022.01.09
22.01.09 [prisma] CRUD update query  (0) 2022.01.09
22.01.05 [prisma] Date.now()와 new Date()  (0) 2022.01.05
21.11.02 prisma 설치하기  (0) 2021.11.04
21.11.01 prisma 설치  (0) 2021.11.01