TypeORM table join

Jiwon Youn·2021년 1월 8일
0

products.entity.ts

@Entity()
export class Product {
  // 자동으로 1씩 증가해 생성되는 값 (sequence)
  @PrimaryGeneratedColumn()
  @IsNumber()
  id: number;

  @Column()
  @IsString()
  name: string;

  @Column()
  @IsNumber()
  price: number;

  @ManyToOne((type) => Categories, (category) => category.products)
  @JoinColumn()
  category: Categories;

여러 개의 product가 같은 category 값을 가질 수 있으므로 ManyToOne

이 때, JoinCoulmn 사용 시 해당 column이 자동으로 생성되는데 (categoryId)

  @Column({ nullable: true })
  @IsNumber()
  categoryId: number;
}

생성된 column과 같은 이름으로 @Column을 정의해주면 연결 됨
Insert 와 Update 시에도 적용

참고 본문

위와 같은 방법보다는 Product에 @RelationId((product: Product) => product.categoryId) 로 생성된 내부 컬럼을 명시하여 선언하고 사용할 것


categories.entity.ts

@Entity()
export class Categories {
  @PrimaryGeneratedColumn()
  @IsNumber()
  id: number;

  @Column()
  @IsString()
  categoryName: string;

  @OneToMany((Type) => Product, (product) => product.category)
  products: Product[];
}

category 하나에 product가 여러 개 있을 수 있으므로 OneToMany


products.service.ts

async getAll(): Promise<ProductsOutput> {
    try {
      return {
        ok: true,
        data: await this.products.find({ relations: ['category'] }),
      };
    } catch (e) {
      return {
        ok: false,
        error: e,
      };
    }
  }

기존의 find()가 아닌 find({ relations: ['category'] }) 사용

async getOne(id: number): Promise<ProductOutput> {
  try {
    // throw new BadRequestException();
    return {
      ok: true,
      data: await this.products.findOne(id, { relations: ['category'] }),
    };
  } catch (e) {
    return {
      ok: false,
      error: e,
    };
  }
}

findOne(id, { relations: ['category'] }) 사용

async create(productData: CreateProductDto): Promise<void> {
    try {
      const product = this.products.create(productData);
      // DB에 create가 아닌 product 객체에 create
      
      await this.products.save(product);
      // product 객체 DB에 save
    } catch (e) {
      console.log('error');
    }
  }
  
  async update(id: number, updateData): Promise<void> {
    try {
      await this.products.update(id, updateData);
    } catch (e) {
      console.log('error');
    }
  }

위 예제 요청값 전송

{
	"name": "22",
	"price": 1221,
	"categoryId": 1
}

0개의 댓글