TypeORM CreateQueryBuilder 컨닝페이퍼

·2022년 9월 25일
1

SKILL

목록 보기
13/16
post-thumbnail

이것을 포스팅하는 이유는 정말 단순하다.

내가 찾아보는데 너무 짜증나고 답답해서 걍 내가 생각날 때 마다, 사용하는 것 마다 모아놓으려고(....)

근데 이게 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();

주기적으로 생각나고 까먹을 때 마다 추가 예정

profile
물류 서비스 Backend Software Developer

0개의 댓글