// 지역 테이블
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?
}
export interface ICreateDistrictDTO {
region: Region;
name: string;
bjdongs: IBjdongDTO[];
}
지역 테이블에 입력하는 DTO 입니다.
자세히 보시면 객체 타입 배열을 넣는 것을 볼 수 있습니다.
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;
}
위 예시는 지역 테이블에 입력하는 서비스의 create 메소드입니다.
위 예처럼 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;
}
id만 따로 추출해서 배열로 만든 후 변수에 할당합니다.
map 을 활용하여 연결된 모든 법정동 테이블의 행을 넣습니다.
끝! 타입스크립트 참 좋네요..!