typeorm - find 옵션

jegw·2023년 8월 24일
0

TIL

목록 보기
65/77
post-custom-banner

전체 조회

async findAll(): Promise<Product[]> {
    const products = await this.productRepository.find();
    if (!products) throw new NotFoundException('상품이 존재하지 않습니다.');
    return products;
  }

where절만 옵션을 줄때는 findBy로 where생략이 가능하다.

async findByMemberId(memberId: number) {
    const products = await this.productRepository.findBy({ member_id: memberId });
    return products;
  }

검색어로 조회

async search(search: SearchProductDto): Promise<Product[]> {
    const { searchString } = search;
    const products = await this.productRepository.find({ where: { name: Like(`%${searchString}%`) } });
    return products;
  }

정렬, 선택, 조인

async findPickedProducts(memberId: number) {
    const result = await this.pickRepository.find({
      where: { member_id: memberId },
      relations: { product: true },
      select: { member_id: true },
      order: { createdAt: 'DESC' },
    });
    if (!result.length) throw new NotFoundException('상품이 존재하지 않습니다.');
    const pickedProducts = result.map((item) => {
      return item.product;
    });
    return pickedProducts;
  }
  • order : 정렬
  • select : 조회할 컬럼 선택
  • relations : 외래키로 연결된 테이블 중 조인할 테이블 선택
relations: { product: { productImages: true } },
//이렇게 하면 이중 조인이 가능하다.

relations를 사용하지 않고 join : eager 로딩

엔티티에 eager:true라는 옵션을 주면 조회할 때 relatons 옵션을 주지 않아도 연결된 테이블이 같이 조회된다.

@OneToMany(() => ProductImage, (productImage) => productImage.product, { eager: true })
  productImages: Product[];
  • Eager relations only work when you use find* methods
  • 한쪽에만 eager 플래그 설정하여 로드할 수 있다.
  • 쿼리빌더에서는 eager로딩이 안됨.
post-custom-banner

0개의 댓글