gpt4 book ai didi

sql - 为自引用表设置一对多关系

转载 作者:行者123 更新时间:2023-12-03 14:32:25 25 4
gpt4 key购买 nike

我有一个 Project具有非自动生成的 id 字段和后继字段的实体。这个继任者是接下来的项目。但也许没有后续项目,所以这可能为空。

@Entity()
export class Project extends BaseEntity {
@PrimaryColumn({ unique: true })
public id: string;

@OneToMany(() => Project, project => project.id, { nullable: true })
public successorId?: string;
}

通过创建新项目时
public createProject(id: string, successorId?: string): Promise<Project> {
const project: Project = new Project();
project.id = id;
project.successorId = successorId;
return project.save();
}

有多种情况我必须处理。
  • 传入一个已经存在的 id:

    这不会抛出错误。它只是覆盖现有实体。
  • 路过 undefinedsuccessorId :

    代码工作正常,但它不会创建 successorId列与 null然后。该列根本不存在于数据库中。
  • id 传递相同的 ID和 successorId (这应该是可能的):

    TypeORM 抛出错误

    TypeError: Cannot read property 'joinColumns' of undefined

  • 传入 successorId另一个现有项目的:

    我收到与上述相同的错误
  • 传入 successorId不存在的项目:

    我收到与上述相同的错误

  • 那么我该如何解决呢?我认为我的实体设计似乎是错误的。基本上应该是
  • 一个项目可能有一个继任者
  • 一个项目可以是多个项目的继承者

  • 如果有人可以提供帮助,那就太棒了!

    更新

    我也试过这个
    @OneToMany(() => Project, project => project.successorId, { nullable: true })
    @Column()
    public successorId?: string;

    但每当我想调用 createProject方法我收到此错误

    QueryFailedError: null value in column "successorId" violates not-null constraint



    和这个
    @OneToMany(() => Project, project => project.successorId, { nullable: true })
    public successorId?: string;

    但后来我收到了这个错误

    TypeError: relatedEntities.forEach is not a function

    最佳答案

    请试试这个解决方案

    @Entity()
    export class Project extends BaseEntity {
    @PrimaryColumn({ unique: true })
    public id: string;

    @Column({ nullable: true })
    public successorId?: string;

    @ManyToOne(() => Project, project => project.id)
    @JoinColumn({ name: "successorId" })
    public successor?: Project;
    }
    public successor?: Project; - 属性用于建立实体(在本例中为同一实体)之间的关系。相关实体必须指定为属性类型,因为 TypeORM 使用此类型来确定目标实体并构建关系元数据。您可以阅读有关 TypeORM 关系的更多信息 here public successorId?: string; - 属性只是一个“提取的”连接列。当您使用 ManyToOne关系,TypeORM 会自动在数据库中创建一个名为 propertyName 的列+ referencedColumnName (在这种情况下为 successorId)。但是你不能在你的代码中使用这个列,因为它只在表中而不是在你的类中定义。如果您需要在类中定义此列(用于进一步保存或显示),您可以创建一个属性并用 @Column 标记它。装饰器。属性名称必须与表中的连接列名称相同。更详细的描述 here

    Creating an entity with the same id just overrides the existing one


    这是预期的行为。当您尝试使用现有 Id 保存实体时,TypeORM 会将其识别为更新,而不是创建

    关于sql - 为自引用表设置一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60361397/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com