用typeorm映射多对多关系

问题描述 投票:0回答:1

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

@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;
}

我期望的行为是,在急切加载的情况下,我搜索一个用户时得到一个组的列表,搜索一个组时得到一个用户的列表。我知道我不能两边都有'急切',但先了解如何只用一个实体就够了。

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

database typescript migration modeling typeorm
1个回答
0
投票

我是用下面的方法来做的。

实体group:

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

如何在Repository中加载这些实体

findById(group_id: string): Promise<Group | undefined> {
    return this.ormRepository.findOne(group_id, {
      relations: ['members', 'members.users'],
    });
  }
© www.soinside.com 2019 - 2024. All rights reserved.