정해진 typeORM
만으로는 모든 종류의 쿼리들을 표현하는 데 한계가 있다.
이러한 단점을 보완하기 위한 것이 바로 query buidler
이다.
this.testRepository
.createQueryBuilder('test') // FROM test test 와 같이 이름 지정
.select('test_id')
.addSelect('COUNT(*)::integer')
.where(...)
.andwhere(new Brackets(qb => {
qb.where('test.test_status = :test_status', { test_status: 'yes' })
.orWhere('test.test_status = :test_status', { test_status: 'host' })
}))
.groupBy('test_id')
.getRawMany();
typeORM 에서는 join
을 어떻게 구현할까?
LEFT JOIN
leftJoin('<기준이 되는 테이블>.<연결할 엔티티>', '<연결할 엔티티가 사용할 이름>')
join
을 원할 경우에는 join 하려는 entity
들에 각각 manyToOne 또는 OneToMany 관계를 정의해주어야 한다.
예시로는 여기 를 참고해보자.
[gitbook query builder] https://orkhan.gitbook.io/typeorm/docs/select-query-builder
[typeORM] https://typeorm.io
https://itchallenger.tistory.com/231
QueryBuilder 를 통해서 반환 받은 데이터의 종류에는 크게 두가지가 존재하는데, Entity type
또는 Raw Result
이다.
대부분의 경우 결과값으로 DB 의 entity
를 반환 받지만, 특정 연산을 하거나 특정 column 만을 반환 받을 경우와 같이
raw data
를 반환 받아야 하는 경우가 생긴다. 각각의 경우에 사용하는 함수를 분류해보면 다음과 같다
getOne | getMany: Promise<Entity[]> {}
getOne(), getMany()를 이용해서 데이터를 조회할 경우, entity class instance 를 반환하기 때문에 특정 Column 들만 가져오는 경우에, getOne() 또는 getMany() 를 쓰게 되면 문제가 일어날 수 있다.
getRawOne | getRawMany<T = any>(): Promise<T[]> {}
자동생성되는 ID값을 표현하는 방식을 아래와 같이 2가지 옵션을 사용할 수 있도록 도와준다
increment
: AUTO_INCREMENT를 사용해서 1씩 증가하는 ID를 부여한다. 기본 옵션이다.
uuid
: 유니크한 uuid를 사용할 수 있다.
// using increment
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
}
// using uuid
@Entity()
export class User {
@PrimaryGeneratedColumn('uuid')
id: string
}
https://yangeok.github.io/orm/2020/12/14/typeorm-decorators.html