Prisma foreign key select array

agnusdei·2023년 7월 5일
0
post-custom-banner
// 지역 테이블
model District {
  id        String    @id @default(uuid())
  region    Region
  name      String
  bjdongs   Bjdong[]
  createdAt DateTime  @default(now())
  deletedAt DateTime?
  admin     Admin     @relation(fields: [adminId], references: [id])
  adminId   String
}

// 법정동 테이블
model Bjdong {
  id             String          @id @default(uuid())
  name           String
  code           String
  sigungu        Sigungu         @relation(fields: [sigunguId], references: [id])
  sigunguId      String
  sido           Sido            @relation(fields: [sidoId], references: [id])
  sidoId         String
  district       District?       @relation(fields: [districtId], references: [id])
  districtId     String?
}
  1. 총 두 개의 테이블이 존재합니다.
export interface ICreateDistrictDTO {
  region: Region;
  name: string;
  bjdongs: IBjdongDTO[];
}
  1. 지역 테이블에 입력하는 DTO 입니다.

  2. 자세히 보시면 객체 타입 배열을 넣는 것을 볼 수 있습니다.

  3. primsa 에 입력 시 이러한 타입을 어떻게 등록하는 지 예시를 보도록 합니다.

async create(data: CreateDistrictDTO, admin: AdminDTO): Promise<District> {

    const created = await this.prismaService.district.create({
      data: {
        name: data.name,
        region: data.region,
        adminId: admin.id,
        bjdongs: {
          connect: { id: data.bjdongs[0].id },
        },
      },
    });
    return created;
  }
  1. 위 예시는 지역 테이블에 입력하는 서비스의 create 메소드입니다.

  2. 위 예처럼 connect: 를 활용하여 법정동 코드를 조회하여 동일한 id 를 가진 데이터를 배열로 넣을 수 있습니다.

하지만! 0번째만 넣을 수 밖에 없습니다.

따라서 코드를 수정해보겠습니다.

async create(data: CreateDistrictDTO, admin: AdminDTO): Promise<District> {
    const bjdongIds = data.bjdongs.map(bjdong => bjdong.id); // id만 추출하여 배열로 만들어 변수에 할당

    const created = await this.prismaService.district.create({
      data: {
        name: data.name,
        region: data.region,
        adminId: admin.id,
        bjdongs: {
          connect: bjdongIds.map(id => ({id})) // map 활용
        },
      },
    });
    return created;
  }
  1. id만 따로 추출해서 배열로 만든 후 변수에 할당합니다.

  2. map 을 활용하여 연결된 모든 법정동 테이블의 행을 넣습니다.

끝! 타입스크립트 참 좋네요..!

post-custom-banner

0개의 댓글