使用 typeorm 映射多对多关系

Mapping many to many relations with typeorm

我想做的是显示与另一个实体相关的所有对象的列表。本项目中,一个组有多个用户,一个用户有多个组。

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

  @Column()
  name: string;

 @OneToMany(() => GroupMember, groupMember => groupMember.user, {
    eager: true,
  })
  @JoinTable()
  members: User[];

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;
}

用户

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

  @Column()
  first_name: string;

  @Column()
  email: string;

  @OneToMany(() => GroupMember, groupMember => groupMember.group)
  @JoinTable()
  groups: Promise<Group[]>;

  @CreateDateColumn()
  @Exclude()
  created_at: Date;

  @UpdateDateColumn()
  @Exclude()
  updated_at: Date;
}

用户组

@Entity('group_member')
class GroupMember {
  @PrimaryColumn()
  group_id: string;

  @ManyToOne(() => Group, { primary: true })
  @JoinColumn({ name: 'group_id' })
  group: Promise<Group>;

  @PrimaryColumn()
  user_id: string;

  @ManyToOne(() => User, { primary: true })
  @JoinColumn({ name: 'user_id', referencedColumnName: 'id' })
  user: Promise<User>;

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;
}

我期望的行为是,通过预先加载,我在搜索用户时获得组列表,在搜索组时获得用户列表。我知道我不能在两边都有 'eager',但是首先了解如何只处理一个实体就足够了。

目前,我在搜索群组时得到的只是一个空列表。

我是通过以下方式完成的:

实体组:

@OneToMany(() => GroupMember, groupMember => groupMember.groups)
  members: GroupMember[];

实体用户

@OneToMany(() => GroupMember, groupMember => groupMember.groups)
  groups: GroupMember[];

实体group_users

  @ManyToOne(() => Group, { primary: true })
  @JoinColumn({ name: 'group_id' })
  groups: Group[];

@ManyToOne(() => User, { primary: true })
  @JoinColumn({ name: 'user_id' })
  users: User[];

如何在存储库中加载这些实体

findById(group_id: string): Promise<Group | undefined> {
    return this.ormRepository.findOne(group_id, {
      relations: ['members', 'members.users'],
    });
  }