해결됨
Slack 클론 코딩[백엔드 with NestJS + TypeORM]
One-to-Many Self Referencing 문제
안녕하세요 One-to-Many 관계 정의 시에 해결이 잘 안되서 문의 드립니다. Typeorm 사이트에서 정보를 참조도 해보고 구글링도 해봐서 시도해봤지만 명확하게 원하던 결과가 나오지 않아서 문의드립니다.@Entity("Parts", { schema: "workplaces" })
export class Parts {
@PrimaryColumn('varchar', { name: "partsNumber", unique: true, nullable: false })
partsNumber: string;
@Column('varchar', { name: 'partsName', length: 500, nullable: true })
name: string;
@Column('bool', { name: 'isMain', nullable: false, default: false })
isMain: boolean;
@CreateDateColumn()
createDate: Date;
@UpdateDateColumn()
updateDate: Date;
@DeleteDateColumn()
deleteDate: Date | null;
// 여기부터가 문의 드리는 One to Many 관계설정 코드입니다.
@ManyToOne(() => Parts, (parts) => parts.alternative, { onDelete: "SET NULL", onUpdate: "CASCADE" })
parts: Parts;
@OneToMany(() => Parts, (alternative) => alternative.parts)
@JoinColumn([{ name: "alternative", referencedColumnName: "partsNumber" }])
alternative: Parts[];
}보시면 아시겠지만, Parts 테이블에 alternative란 항목의 다수의 Parts 타입을 데이터로 받도록 구성한 것인데요, 부품의 경우, 대체 부품이 여럿이 존재해서 isMain 항목을 통해서 부품이 main부품일 경우에만 데이터를 저장하고 호출해주며, main 부품이 아닌경우, 연결된 main parts 의 정보를 호출해주도록 하기 위해서 입니다. 실제로 이렇게 구성할 경우, 아래와 같은 데이터를 저장할시{
"partsNumber": "341241",
"name": "341241 Dryer Drum Belt",
"isMain": true,
"alternative": [
{ "partsNumber": "14210003" },
{ "partsNumber": "20065315" },
]
}이상없이 저장이 완료됩니다.Main part(parent) 검색시에 보통 사용하던 One to Many에서처럼 alternative에 제대로 2개의 배열객체가 출력이 됩니다만, 문제는 alternative 데이터를 검색하여 main이 되는 part를 출력하지 못하는 점인데요. Self Referencing 으로 One to Many관계를 설정시에 children측에서 parent 쪽의 정보를 호출하려면 어떻게 설정해야 하나요?항상 답변을 주셔서 감사합니다!