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();
성능 증가를 위해 다음과 같이 수정함.
따라서 매 조회시 10개씩만 가져오게 된다.