백엔드/NestJs

typeorm 1:1, 1:N 관계

STUFIT 2023. 6. 11. 15:52
반응형

nestjs에서 일대일, 다대일, 다대다 관계를 설정할 때에는 entity에 다음과 같이 작성을 한다.

1. 일대일 관계(1:1)

// Product entity

import {
  Column, CreateDateColumn, DeleteDateColumn,
  Entity,
  JoinColumn,
  JoinTable,
  ManyToMany,
  ManyToOne,
  OneToOne,
  PrimaryGeneratedColumn, UpdateDateColumn,
} from 'typeorm';
import { ProductSaleslocation } from '../../productsSaleslocations/entities/productSaleslocation.entity';
import { ProductCategory } from '../../productsCategories/entities/productCategory.entity';
import { User } from '../../users/entities/user.entity';
import { ProductTag } from '../../productsTags/entities/productTag.entity';
import { Field, Int, ObjectType } from '@nestjs/graphql';

@ObjectType()
@Entity()
export class Product{
  @PrimaryGeneratedColumn('uuid')
  @Field(()=> String)
  id:string

  @JoinColumn() // 관계를 맺을 시, JoinColumn()을 작성
  @OneToOne(()=> ProductSaleslocation) // ProductSaleslocation 테이블과 1:1관계를 맺도록 표현
  @Field(()=> ProductSaleslocation)  // graphql용 스키마
  productSaleslocation:ProductSaleslocation

}

일대일 관계일 경우에는, 예를들어 Product 엔티티와, ProductSaleslocation 엔티티를 1:1 관계를 맺는다고 가정 시,

관계에 있어서 중심이 되는 엔티티(Product entity)에 관계를 원하는 엔티티(ProductSaleslocation)를 @OneToOne 데코레이터를 이용하여 관계를 맺어준다.

2. 다대일 관계(1:N)

// Product Entity

import {
  Column, CreateDateColumn, DeleteDateColumn,
  Entity,
  JoinColumn,
  JoinTable,
  ManyToMany,
  ManyToOne,
  OneToOne,
  PrimaryGeneratedColumn, UpdateDateColumn,
} from 'typeorm';
import { ProductSaleslocation } from '../../productsSaleslocations/entities/productSaleslocation.entity';
import { ProductCategory } from '../../productsCategories/entities/productCategory.entity';
import { User } from '../../users/entities/user.entity';
import { ProductTag } from '../../productsTags/entities/productTag.entity';
import { Field, Int, ObjectType } from '@nestjs/graphql';

@ObjectType()
@Entity()
export class Product{
  @PrimaryGeneratedColumn('uuid')
  @Field(()=> String)
  id:string

  @ManyToOne((type)=> ProductCategory, (pc)=> pc.products) 
  @Field(()=> ProductCategory)
  productCategory:ProductCategory

}
// ProductCategory Entity

import {
  Column, CreateDateColumn, DeleteDateColumn,
  Entity,
  JoinColumn,
  JoinTable,
  ManyToMany,
  ManyToOne,
  OneToOne,
  PrimaryGeneratedColumn, UpdateDateColumn,
} from 'typeorm';
import { ProductSaleslocation } from '../../productsSaleslocations/entities/productSaleslocation.entity';
import { ProductCategory } from '../../productsCategories/entities/productCategory.entity';
import { User } from '../../users/entities/user.entity';
import { ProductTag } from '../../productsTags/entities/productTag.entity';
import { Field, Int, ObjectType } from '@nestjs/graphql';

@ObjectType()
@Entity()
export class ProductCategory{
  @PrimaryGeneratedColumn('uuid')
  @Field(()=> String)
  id:string

  @OneToMany((type)=> Product, (products)=> products.productCategory) 
  @Field(()=> [Product])
  products:Product[]

}

1) product와 productCategory 엔티티를 다대일로 관계를 맺을 시, 여러개의 상품은 하나의 카테고리를 갖는다고 가정 시,

ManyToOne 은 product, OneToMany는 productCategory에 붙여준다.

 

반응형