[Nest.js] Table leftJoin with Mysql2

Programming/Node.js 2024. 11. 24. 14:44 Posted by 생각하는로뎅
반응형

nest.js + mysql2

 

조합으로 테이블 join 을 하려고 했다가.. 시간을 너무 많이 허비해서 글로 작성해두기로 했다.

 

1. 테이블 관계는 아래와 같다.

2. 각 파일 내용과 중요 내용

 

  여기서 중요한 것은

 

  class_list(class_cd) : class_item_list(class_cd) 의 관계는 1:N 이다.

 

 때문에 

 

 class_list.entity.ts 파일의 class_cd는  반드시 OneToMany 를 주입 시켜 주어야하며,

 

 class_item_list.entity.ts 의 class_cd 에는ManyToOne 을 주입 시켜줘야하고, 추가적으로 JoinColumn 도 주입 시켜 줘야한다.

 

  2-1) class_list.entity.ts

import { Entity, Column, OneToMany, JoinColumn, PrimaryColumn } from 'typeorm';
import { ClassItemList } from '../class_item_list/class_item_list.entity'

@Entity({ schema: 'dkdoctor_pet_exam', name: 'class_list' })
export class ClassList {

  @PrimaryColumn({ name: 'class_cd'})
  classCd: string;

  @Column({ name: 'value'})
  value: string;

  @OneToMany(()=>ClassItemList, classItemList => classItemList.classCd)
  classItemList: ClassItemList[];

}

 

 

  2-2) class_item_list.entity.ts

import { Entity, Column, PrimaryGeneratedColumn, JoinColumn, OneToMany, ManyToOne, PrimaryColumn } from 'typeorm';
import { ClassList } from '../class_list/class_list.entity';

@Entity({ schema: 'dkdoctor_pet_exam', name: 'class_item_list' })
export class ClassItemList {

  @PrimaryGeneratedColumn({ name: 'class_item_id' })
  classItemId: bigint;

  @ManyToOne(()=>ClassList, classList => classList.classCd)
  @JoinColumn({ name: 'class_cd'})
  @Column({ name: 'class_cd'})
  classCd: string;

  @Column({ name: 'value'})
  value: string;

  @Column({ name: 'comment'})
  comment: string;

}

 

 

  2-3) class_list.module.ts

// class_list.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ClassList } from './class_list.entity';
import { ClassListService } from './class_list.service';

@Module({
  imports: [TypeOrmModule.forFeature([ClassList])],
  exports: [TypeOrmModule],
  providers: [ClassListService]
})
export class ClassListModule {}

 

  2-4) class_list.service.ts

@Injectable()
export class ClassListService {
  constructor(
    @InjectRepository(ClassList)
    private classListRepository: Repository<ClassList>, // UserRepository 주입
  ) {}

  findClassInfo(classCd : String): Promise<ClassList> {

    return this.classListRepository.createQueryBuilder('m')
    .leftJoinAndSelect('m.classItemList', 't')
    .where('m.classCd = :classCd', {classCd: classCd})
    .getOne();

  }

  async remove(id: number): Promise<void> {
    await this.classListRepository.delete(id);
  }
}

 

  2-5) app.module.ts

@Module({
  imports: [
    ..., ClassListModule
  ],
  controllers: [AppController],
  providers: [
    AppService, ClassListService
  ],
})
export class AppModule {}

 

 2-6) app.controller.ts

@Controller()
export class AppController {
  
  ...

  @Get('url')
  @Render('file name')
  async getRegisterStepOne() {
    const result = await this.classListService.findClassInfo('param');
    return { key: result };
  }
  ...
}
반응형