Skip to content

A. TypeOrm Query Builder

terminal
npx nest g module queryBuilder
npx nest g service queryBuilder
npx nest g controller queryBuilder

Module

query-builder.module.ts
import { Module } from '@nestjs/common';
import { QueryBuilderService } from './query-builder.service';
import { QueryBuilderController } from './query-builder.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from 'src/app/auth/auth.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [QueryBuilderService],
  controllers: [QueryBuilderController],
})
export class QueryBuilderModule {}

Controller

query-builder.controller.ts
import { Controller, Get, Post, UseGuards } from '@nestjs/common';
import { JwtGuard } from 'src/app/auth/auth.guard';
import { QueryBuilderService } from './query-builder.service';

// @UseGuards(JwtGuard)
@Controller('query-builder')
export class QueryBuilderController {
  constructor(private readonly querybuilderService: QueryBuilderService) {}
  @Get('/latihan')
  async LatihanController() {
    return this.querybuilderService.latihan();
  }
}

Service

query-builder.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from 'src/app/auth/auth.entity';
import BaseResponse from 'src/utils/response/base.response';
import { Repository } from 'typeorm';

@Injectable()
export class QueryBuilderService extends BaseResponse {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: Repository<User>,
  ) {
    super();
  }

  async latihan() {
    const result = await this.userRepository
      .createQueryBuilder('user')

      .getMany();

    return this._success('ok', result);
  }
}

QueryBuilder DTO

query-builder.dto.ts
import { IsOptional, IsString } from 'class-validator';
import { PageRequestDto } from 'src/utils/dto/page.dto';

export class latihanQueryBuilderDto extends PageRequestDto {
  @IsString()
  @IsOptional()
  nama: string;

  @IsString()
  @IsOptional()
  nama_produk: string;

  @IsString()
  @IsOptional()
  stok: string;
}

Where

query-builder.service.ts
...

  async latihan(query: latihanQueryBuilderDto) {
    const { nama } = query;
    const queryBuilder = await this.userRepository.createQueryBuilder('user');

    if (nama) {
      queryBuilder.where(`user.nama LIKE :nama`, {
        nama: `%${nama}%`,
      });
    }

    const result = await queryBuilder.getMany();

    return this._success('ok', result);
  }

Latihan query pada Produk

Module

query-builder.module.ts
import { Module } from '@nestjs/common';
import { QueryBuilderService } from './query-builder.service';
import { QueryBuilderController } from './query-builder.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from 'src/app/auth/auth.entity';
import { Produk } from 'src/app/produk/produk.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User, Produk])],
  providers: [QueryBuilderService],
  controllers: [QueryBuilderController],
})
export class QueryBuilderModule {}

Controller

query-builder.controller.ts
 @Get('/latihan2')
  async LatihanController2(@Pagination() query: latihanQueryBuilderDto) {
    return this.querybuilderService.latihan2(query);
  }

Service

AndWere dan Select

query-builder.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from 'src/app/auth/auth.entity';
import BaseResponse from 'src/utils/response/base.response';
import { Repository } from 'typeorm';
import { latihanQueryBuilderDto } from './query-builder.dto';
import { Produk } from 'src/app/produk/produk.entity';

@Injectable()
export class QueryBuilderService extends BaseResponse {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: Repository<User>,
    @InjectRepository(Produk)
    private readonly produkRepository: Repository<Produk>,
  ) {
    super();
  }


  async latihan2(query: latihanQueryBuilderDto) {
    const { nama_produk, stok } = query;
    const queryBuilder = await this.produkRepository.createQueryBuilder(
      'produk',
    );

    if (nama_produk) {
      queryBuilder.where(`produk.nama_produk LIKE :nama_produk`, {
        nama_produk: `%${nama_produk}%`,
      });
    }

    if (stok) {
      queryBuilder.andWhere(`produk.stok LIKE :stok`, {
        stok: stok,
      });
    }

    queryBuilder.select([
      'produk.nama_produk',
      'produk.stok',
      'produk.harga',
      'produk.deskripsi_produk',
    ]);

    const result = await queryBuilder.getMany();

    return this._success('ok', result);
  }
}

LeftJoin

query-builder.service.ts
async latihan2(query: latihanQueryBuilderDto) {
    const { nama_produk, stok } = query;
    const queryBuilder = await this.produkRepository.createQueryBuilder(
      'produk',
    );

    if (nama_produk) {
      queryBuilder.where(`produk.nama_produk LIKE :nama_produk`, {
        nama_produk: `%${nama_produk}%`,
      });
    }

    if (stok) {
      queryBuilder.andWhere(`produk.stok LIKE :stok`, {
        stok: stok,
      });
    }

    queryBuilder
      .leftJoin(`produk.created_by`, 'created_by')
      .leftJoin(`produk.updated_by`, 'updated_by')
      .select([
         'produk.id',
        'produk.nama_produk',
        'produk.stok',
        'produk.harga',
        'produk.deskripsi_produk',
        'created_by.nama',
        'updated_by.nama',
      ]);

    const result = await queryBuilder.getMany();

    return this._success('ok', result);
  }

Pagination

query-builder.service.ts
async latihan2(query: latihanQueryBuilderDto) {
    const { nama_produk, stok, limit, page, pageSize } = query;
    const queryBuilder = await this.produkRepository.createQueryBuilder(
      'produk',
    );

    if (nama_produk) {
      queryBuilder.where(`produk.nama_produk LIKE :nama_produk`, {
        nama_produk: `%${nama_produk}%`,
      });
    }

    if (stok) {
      queryBuilder.andWhere(`produk.stok LIKE :stok`, {
        stok: stok,
      });
    }

    queryBuilder
      .leftJoin(`produk.created_by`, 'created_by')
      .leftJoin(`produk.updated_by`, 'updated_by')
      .select([
        'produk.id',
        'produk.nama_produk',
        'produk.stok',
        'produk.harga',
        'produk.deskripsi_produk',
        'created_by.nama',
        'updated_by.nama',
      ])

      .skip(limit)
      .take(pageSize);

    const result = await queryBuilder.getMany();
    const total = await queryBuilder.getCount();

    return this._pagination('OK', result, total, page, pageSize);
  }