Entity mapping Many to Many with typeorm

Asked

Viewed 589 times

1

What I want to do is a list of all the objects that are related by the ID to an entity. In this project, a group has several users and one user belongs to several groups.

Group entity:

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

User Entity

@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-User

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

The behavior I hope is that, through Eager loading, I get a list of groups when I search for a user and/or get a list of users when I search for the group. What I’m currently getting are both empty lists.

1 answer

2


I managed to get the desired result by doing the following:

In the group entity:

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

In the user entity

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

In the group_users entity

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

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

Here’s an example of how to load these entities from the group repository:

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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.