使用 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'],
});
}
我想做的是显示与另一个实体相关的所有对象的列表。本项目中,一个组有多个用户,一个用户有多个组。
组
@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'],
});
}