eager

김종민·2022년 9월 22일
0

Nuber-Server

목록 보기
33/34


들어가기
typeOrm사용시 관련된 data들을 불러올떄,
relations:{
restaurant:true}
등으로 사용했지만,
entity에 eager:true를 찍어주면, typeOrm에
relations을 설정해 주지 않아도,
자동적으로 관련 data들을 같이 load한다.
나중에 너무 많은 data가 load되면, server과부하가
문제될 수 있으니, 참고한다.

NOTICE!!!
eager는 설정을 하면 양쪽에 다 적용되기 때문에, 한쪽만 설정해 주면 된다.
order entity에서 restaurant에 eager:true 했으면,
restaurant entity에서는 eager:true를 해 주지 않아도됨.

1.orders/entities/order.entity

import {
  Field,
  Float,
  InputType,
  ObjectType,
  registerEnumType,
} from '@nestjs/graphql';
import { IsEnum } from 'class-validator';
import { CoreEntity } from 'src/common/entities/core.entity';
import { Restaurant } from 'src/restaurant/entities/restaurant.entity';
import { User } from 'src/users/entities/user.entity';
import {
  Column,
  Entity,
  JoinTable,
  ManyToMany,
  ManyToOne,
  RelationId,
} from 'typeorm';
import { OrderItem } from './order-item.entity';

export enum OrderStatus {
  Pending = 'Pending',
  Cooking = 'Cooking',
  Cooked = 'Cooked',
  PickedUp = 'PickedUp',
  Deliverd = 'Deliverd',
}

registerEnumType(OrderStatus, { name: 'OrderStatus' });

@InputType('OrderInputType', { isAbstract: true })
@ObjectType()
@Entity()
export class Order extends CoreEntity {
  @Field(() => User, { nullable: true })
  @ManyToOne(() => User, (user) => user.orders, {
    onDelete: 'SET NULL',
    nullable: true,
    eager: true,  =======>order를 call하면, customer 같이 불려짐
  })
  customer?: User;

  @RelationId((order: Order) => order.customer)
  customnerId: number;

  @Field(() => User, { nullable: true })
  @ManyToOne(() => User, (user) => user.rides, {
    onDelete: 'SET NULL',
    nullable: true,
    eager: true,  =======>order를 call하면, driver도 같이 불려짐
  })
  driver?: User;

  @RelationId((order: Order) => order.driver)
  driverId: number;

  @Field(() => Restaurant, { nullable: true })
  @ManyToOne(() => Restaurant, (restaurant) => restaurant.orders, {
    onDelete: 'SET NULL',
    nullable: true,
    eager: true,   =======>order를 call하면, restaurant도 같이 불려짐
  })
  restaurant: Restaurant;

  @Field(() => [OrderItem])
  @ManyToMany(() => OrderItem, { eager: true })
  @JoinTable()
  items: OrderItem[];

  @Column({ nullable: true })
  @Field(() => Float, { nullable: true })
  total?: number;

  @Column({ type: 'enum', enum: OrderStatus, default: OrderStatus.Pending })
  @Field(() => OrderStatus)
  @IsEnum(OrderStatus)
  status: OrderStatus;
}

profile
코딩하는초딩쌤

0개의 댓글