출처: https://velog.io/@yukina1418/TypeORM-CreateQueryBuilder-%EC%BB%A8%EB%8B%9D%ED%8E%98%EC%9D%B4%ED%8D%BC
이것을 포스팅하는 이유는 정말 단순하다.
내가 찾아보는데 너무 짜증나고 답답해서 걍 내가 생각날 때 마다, 사용하는 것 마다 모아놓으려고(....)
근데 이게 0.2버전이라 0.3버전에서도 적용되는지 솔직히 모르겠다.
대부분 호환이 된다고는 알고있는데 (쿼리빌더쪽은) 정말 되는지는...해봐야알듯..ㅠ
selectQueryBuilder(조회)
where를 쓰는 다양한 방법
주의 ! ${} 사이에 들어가는 값이 문자열이라면, 쌍따옴표를 꼭 넣어줘야한다 !
(적힌 것 외에도 다양한 방법이 존재하고, 각각 방향성이 약간씩 차이가 있다고한다.)
await this.connection
.createQueryBuilder(User, 'user')
.where(`id = ${userId}`)
.getOne();
await this.connection
.createQueryBuilder(User, 'user')
.where(`user.id = ${userId}`)
.getOne();
await this.connection
.createQueryBuilder(User, 'user')
.where('user.id = :userId', { userId })
.getOne();
await this.connection
.createQueryBuilder(User, 'user')
.where('user.id = :userId', { userId : payload.userId })
.getOne();
await this.connection
.createQueryBuilder(User, 'user')
.where({ id : userId })
.getOne();
await this.connection
.createQueryBuilder()
.select('user')
.from(User, 'user')
.where({ id : userId })
.getOne();
한개의 조건으로 찾아오기
await this.connection
.createQueryBuilder(User, 'user')
.where('user.name = :name', { name })
.getOne();
await this.connection
.createQueryBuilder(User, 'user')
.where('user.name = :name ', { name:'바보' })
.getOne();
And로 다중 조건 걸어서 찾아오기
await this.connection
.createQueryBuilder(User, 'user')
.where('user.name = :name', { name })
.andWhere('user.gender =:gender',{gender:'man'})
.getOne()
일부만 들어있어도 찾아오기 (LIKE문)
await this.connection
.createQueryBuilder(User, 'user')
.where('user.name LIKE :name', { name: `%${김}%` })
.getOne();
아마 아래꺼도 되는걸로 앎
await this.connection
.createQueryBuilder(User, 'user')
.where('user.name LIKE :name', { name: `%"김"%` })
.getOne();
복수의 값으로 찾아오기 (IN문)
await this.connection
.createQueryBuilder(User, 'user')
.where('user.name IN (:names)', { names })
.getMany();
내가 보고싶은 것만 보기
await this.connection
.createQueryBuilder(User, 'user')
.select(['user.name','user.age'])
.where('user.name IN (:names)', { names })
.getOne();
관계 묶어서 다같이 보기
await this.connection
.createQueryBuilder(User, 'user')
.leftJoinAndSelect('user.item','item')
.where('user.name IN (:names)', { names })
.getOne();
관계로 묶은 것 중에서도 보고싶은 것만 보기
await this.connection
.createQueryBuilder(User, 'user')
.select(['user.name','user.age','item.name'])
.leftJoinAndSelect('user.item','item')
.where('user.name IN (:names)', { names })
.getOne();
이름 바꿔서 보기 바꿔서 보기 (AS문)
await this.connection
.createQueryBuilder(User, 'user')
.select([
'user.address AS juso',
'user.name AS namae'
])
.where('user.name = :name', { name })
.getRawOne();
두개 컬럼 합쳐서 보기 (CONCAT문)
await this.connection
.createQueryBuilder(User, 'user')
.select([
'CONCAT('user.address,user.DetailAddres') address',
])
.where('user.name = :name', { name })
.getRawOne();
없는 컬럼 추가해서 결과값으로 보기 (CONCAT문)
문자열을 넣고 싶을 경우 " " < 사이에 넣어야함!!
await this.connection
.createQueryBuilder(User, 'user')
.select([
'CONCAT("서울특별시 한강공원") address',
])
.where('user.name = :name', { name })
.getRawOne();
상수 값도 추가할 수 있음
const data = "피자"
await this.connection
.createQueryBuilder(User, 'user')
.select([
'CONCAT("${data}") likeMenu',
])
.where('user.name = :name', { name })
.getRawOne();
그거 아니면 이거로 바꿔서 보기 (CASE WHEN ELSE END문)
await this.connection
.createQueryBuilder(User, 'user')
.select([
'CASE WHEN user.likeMenu ="피자" THEN "치킨" ELSE user.name END AS menu'
])
.where('user.age = :age', { age:10 })
.getRawOne();
특정 값이 존재하는 것 찾아오기 (IS NOT NULL문)
await this.connection
.createQueryBuilder(User, 'user')
.select([
'user.address AS juso',
'user.name AS namae'
])
.where('user.name = :name', { name })
.andWhere('user.tags IS NOT NULL')
.getRawOne();
특정 값이 비어있는 것 찾아오기 (IS NULL문)
await this.connection
.createQueryBuilder(User, 'user')
.select([
'user.address AS juso',
'user.name AS namae'
])
.where('user.name = :name', { name })
.andWhere('user.tags IS NULL')
.getRawOne();
몇 개 있는지 체크하기 (COUNT문)
await this.connection
.createQueryBuilder(User, 'user')
.select([
'COUNT(CASE WHEN user.sity IN("인천","수원") THEN 1 END) AS gyeonggi'
])
.where('user.gender = :gender', { gender:"man" })
.getRawMany();
날짜 범위 검색으로 찾아오기 (BETWEEN문)
await this.connection
.createQueryBuilder(User, 'user')
.where('user.gender = :gender', { gender:"man" })
.andWhere(`user.createdAt BETWEEN '${start.toISOString()}' AND '${end.toISOString()}'`)
.getMany();
다중 AND 조건 걸어서 찾아오기 (Brackets문) (보통 검색기능에서 많이 씀!)
const payload = {name:"김씨",age:10}
await this.connection
.createQueryBuilder(User, 'user')
.where('user.gender = :gender', { gender:"man" })
.andWhere(new Brackets(qb)=>{
qb.orWhere(user.name = "${payload.name}");
qb.orWhere(user.age = "${payload.age}");
})
.getMany();
한개의 컬럼값이 동적으로 들어올 때 OR 조건 걸어서 찾아오기 (Brackets문 응용)
const menus = ["치킨","피자","족발"]
await this.connection
.createQueryBuilder(User, 'user')
.where('user.gender = :gender', { gender:"man" })
.andWhere(new Brackets(qb)=>{
menus.forEach(menu:string) => {
qb.orWhere(`user.likeMenu = "${menu}"`)
})
.getMany();
주기적으로 생각나고 까먹을 때 마다 추가 예정