ค้นหาเว็บไซต์

typescript - ความสัมพันธ์กับลูกหลายของการสืบทอดตารางเดียวใน NestJS


สรุปสั้น ๆ:

ฉันต้องการสร้างความสัมพันธ์แบบเดี่ยวกับหลายเอนทิตีที่สืบทอดจากตารางเดียวกัน ในการทำเช่นนั้น ฉันจำเป็นต้องระบุเอนทิตีที่เกี่ยวข้องกับความสัมพันธ์ และฉันต้องการระบุมากกว่าหนึ่งเอนทิตี ดูเหมือนว่าความสัมพันธ์กับหลายประเภทจะไม่สามารถทำได้ แม้ว่าประเภทที่ระบุจะสืบทอดจากตารางเดียวกันก็ตาม มันสามารถทำได้หรือไม่ และถ้าได้ ฉันทำอะไรผิดไป?

คำอธิบายเต็ม:

ฉันมีเอนทิตี Task เป็นเอนทิตีพื้นฐาน สำหรับวัตถุประสงค์ของคำถามนี้ ฉันจะลบคอลัมน์ที่ไม่จำเป็นส่วนใหญ่เพื่อให้ง่ายต่อการติดตาม

import { Column, Entity, TableInheritance } from 'typeorm';

@Entity('tasks')
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export class Task {
  @PrimaryGeneratedColumn({ type: 'bigint' })
  id: string;

  @Column({ length: 255 })
  name: string;
}

และฉันมีเอนทิตี TaskCollection และ SpecialTask ที่สืบทอดเอนทิตี Task ฉันต้องการให้มีความสัมพันธ์แบบพ่อ-ลูกระหว่างพวกมันเพื่อให้เฉพาะเอนทิตีประเภท TaskCollection เท่านั้นที่สามารถมีลูกได้ นั่นคือ TaskCollection สามารถมีลูกได้ทั้งประเภท TaskCollection และ SpecialTask

รหัสเอนทิตี TaskCollection:

import { Type } from 'class-transformer';
import { ChildEntity, ManyToOne, OneToMany } from 'typeorm';

@ChildEntity('task_collections')
export class TaskCollection extends Task {
 @ManyToOne(
    () => TaskCollection,
    tc => tc.childTasks,
    {
      onDelete: 'CASCADE',
    },
  )
  @Type(() => TaskCollection)
  parentTask: TaskCollection;

  @OneToMany(
    () => TaskCollection | SpecificTask,
    t => t.parentTask,
  )
  @Type(() => TaskCollection | SpecificTask)
  childTasks: (TaskCollection | SpecificTask)[];
}

รหัสเอนทิตี SpecificTask:

import { Type } from 'class-transformer';
import { ChildEntity, Column, ManyToOne, OneToMany } from 'typeorm';

@ChildEntity('specific_tasks')
export class SpecificTask extends Task {
 @ManyToOne(
    () => TaskCollection,
    tc => tc.childTasks,
    {
      onDelete: 'CASCADE',
    },
  )
  @Type(() => TaskCollection)
  parentTask: TaskCollection;
}

ปัญหาที่ปรากฏขึ้นเมื่อฉันลองทำสิ่งนี้

ฉันอยากหลีกเลี่ยงการเปลี่ยนแปลงเอนทิตี Task เพราะฉันมีเอนทิตีอื่น ๆ ที่ไม่ได้เชื่อมโยงกับความสัมพันธ์นี้ แต่ฉันก็ไม่รู้ด้วยซ้ำว่ามันเป็นไปได้หรือไม่ที่จะทำแบบนี้

มีข้อเสนอแนะเกี่ยวกับวิธีที่สามารถทำสิ่งนี้ได้หรือไม่?