Сложные отношения TypeORM/MySQL

avatar
thomasaar
8 августа 2021 в 20:34
230
1
0

Я использую TypeORM с MySQL, у меня есть две сущности, пользователь и проект:

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

    @Column({})
    name: string;
}

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

    @Column({})
    name: string;
}

Я хотел бы добавить третий объект, Приглашение. Приглашение состоит из идентификатора пользователя и идентификатора проекта в качестве ключа. Пользователь может быть приглашен в несколько проектов, но только один раз для каждого проекта. Я также хочу сохранить пользователя, отправившего приглашение.

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

    @Column({})
    userID: string;

    @Column({})
    invitedById: string;

    @Column({})
    projectID: string;

    @Column({})
    otherInformations: string;

}

Как этого добиться с помощью декораторов отношений TypeORM?

Спасибо, любая помощь приветствуется, я все еще новичок в мире ORM.

Хорошего окончания выходных.

Источник

Ответы (1)

avatar
currentScript
9 августа 2021 в 10:34
0

Вот как это выглядит в итоге:

@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(), который создает связь между многими пользователями и одним приглашением. То же самое с вашей сущностью Project:

  // 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[];