[ 프로젝트 ] nested join in typeORM

김민석·2021년 7월 1일
0

WORKOUT!

목록 보기
8/18

post쪽의 endpoint를 구현하면서 nested join을 사용할 일이 생겼다.

어우 근데 공식문서를 아무리 쳐다봐도 실마리가 잡히지 않았다.

typeORM git repository에서 예시들을 찾아봤더니 바로 해결 되었다.

예시 링크

정답은 매우 단순했다.

가정은 이러하다.
1. Post : Record = 1 : N
2. Record : Exercise = 1 : N

  const posts: Post[] | undefined = await getRepository(Post)
      [1]  .createQueryBuilder('post')
      [2] .offset(lastId)// * offset : 시작 id , limit : 시작 id 이후 몇개를 사용할지.
      [2] .limit(10) 
      [3] .leftJoinAndSelect('post.records', 'record') 
      [4] .leftJoinAndSelect('record.exercise', 'exercise') 
      [5] .select(['post', 'record', 'exercise.id', 'exercise.name', 'exercise.img']) 
      [6] .getMany(); 

위 코드를 차례대로 보면 다음과 같다.

  • [1] : QueryBuilder 생성. alias는 post로 설정
  • [2] : 마지막 게시글 이후로 10개 자름.
  • [3] : POST-RECORD 관계를 이용하여 `left join. join된 테이블은 'record'로 alias 설정
  • [4] : RECORD-EXERCISE 관계를 이용하여 left join 추가함. alias는 'exercise'로 설정
  • [5] : alias를 이용해서 전체 테이블에서 필요한 것만 선택
  • [6] : 모두 가져오기

Select 관해서 하나 더 추가하자면

기본적으로 무조건 제외되는 column을 만들 수 있다.


수정 .

const lastId: number = req.body.lastId;

    const posts: Post[] | undefined = await getRepository(Post)
      .createQueryBuilder('post')
      .orderBy('post.created_at', 'DESC')
      .where(`post.id < :lastId`, { lastId })
      .limit(10)
      .leftJoinAndSelect('post.records', 'record')
      .leftJoinAndSelect('record.exercise', 'exercise')
      .select(['post', 'record', 'exercise.id', 'exercise.name', 'exercise.img'])
      .getMany();

성능 증가를 위해 다음과 같이 수정함.

  • Orderby로 최신순으로 정렬.
  • 이후 where로 id가 낮은 숫자로 이루어져 있는 것들을 쭉 가져오되,
  • 10개로 제한.

따라서 매 조회시 10개씩만 가져오게 된다.

0개의 댓글