백엔드/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에 붙여준다.
반응형