复杂关系 TypeORM / MySQL

Complex relations TypeORM / MySQL

我将 TypeORM 与 MySQL 一起使用,我有两个实体,用户和项目:

@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 世界还是很陌生。

周末愉快。

最后是这样的:

@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 (just ignore the graphql part) or read the documentation about relations here: 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[];