【问题标题】:Complex relations TypeORM / MySQL复杂关系 TypeORM / MySQL
【发布时间】:2021-10-12 16:53:48
【问题描述】:

我在 MySQL 中使用 TypeORM,我有两个实体,用户和项目:

@Entity()
class User {
    @PrimaryGeneratedColumn('uuid') 
    id: string;  

    @Column({})
    name: string;
}

@Entity()
class Project {
    @PrimaryGeneratedColumn('uuid') 
    id: string;  

    @Column({})
    name: string;
}

我想添加第三个实体,邀请。邀请由 userId 和 projectId 作为 key 组成。可以邀请用户参加多个项目,但每个项目只能邀请一次。我还想存储发送邀请的用户。

@Entity()
class Invitation {
    @PrimaryGeneratedColumn('uuid') 
    id: string;  

    @Column({})
    userID: string;

    @Column({})
    invitedById: string;

    @Column({})
    projectID: string;

    @Column({})
    otherInformations: string;

}

如何使用 TypeORM 关系装饰器来实现这一点?

谢谢,感谢任何帮助,我对 ORM 世界还是很陌生。

周末愉快。

【问题讨论】:

    标签: mysql typescript nestjs typeorm


    【解决方案1】:

    最后是这样的:

    @Entity()
    class Invitation {
      @PrimaryGeneratedColumn("uuid")
      id: string;
    
      @Column({})
      projectID: string;
    
      @Column({})
      otherInformations: string;
    
      // Relations
      @ManyToOne(() => User, (user) => user.invitations)
      user: User;
    
      @ManyToOne(() => Project, (project) => project.invitations)
      project: Project;
    
      @ManyToOne(() => User, (user) => user.invited)
      invitedById: User;
    }
    
    @Entity()
    class Project {
      @PrimaryGeneratedColumn("uuid")
      id: string;
    
      @Column({})
      name: string;
    
      @OneToMany(() => Invitation, (invitation) => invitation.project)
      invitations: Invitation[];
    }
    
    @Entity()
    class User {
      @PrimaryGeneratedColumn("uuid")
      id: string;
    
      @Column({})
      name: string;
    
      @OneToMany(() => Invitation, (invitation) => invitation.user)
      invitations: Invitation[];
    
      @OneToMany(() => Invitation, (invitation) => invitation.invitedById)
      invited: Invitation[];
    }
    

    我试图解释它,但为了更清楚地解释关系,您可以观看此视频:https://www.youtube.com/watch?v=8kZ7W-bI5qQ&t=239s&ab_channel=BenAwad(忽略 graphql 部分)或阅读有关关系的文档:https://typeorm.io/#/relations

    因此,您的邀请实体是用户和项目之间的连接,是多对多关系。 您通过 @ManyToOne() 装饰器访问用户,该装饰器在多个用户和一个邀请之间创建关系。与您的项目实体相同:

      // Invitation.ts
      @ManyToOne(() => User, (user) => user.invitations)
      user: User;
    
      @ManyToOne(() => Project, (project) => project.invitations)
      project: Project;
    

    在每个实体中,您将相反的关系添加到邀请实体

      // User.ts
      @OneToMany(() => Invitation, (invitation) => invitation.user)
      invitations: Invitation[];
    
      @OneToMany(() => Invitation, (invitation) => invitation.invitedById)
      invited: Invitation[];
    
      // Project.ts
      @OneToMany(() => Invitation, (invitation) => invitation.project)
      invitations: Invitation[];
    

    注意我们在这里使用[],因为它是一个 ...ToMany() 关系

    invitedById 的添加方式相同:

      // Invitation.ts
      @ManyToOne(() => User, (user) => user.invited)
      invitedById: User;
    
      // User.ts
      @OneToMany(() => Invitation, (invitation) => invitation.invitedById)
      invited: Invitation[];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多