首页 > 解决方案 > TypeORM 多对多连接表额外列

问题描述

我与 TypeORM 有简单的多对多关系

用户实体

@Entity({ name: 'users' })
export class User {
  @PrimaryColumn()
  id: string;

  @Column()
  email: string;

  @Column()
  password: string;

  @ManyToMany((type) => Organization, (organization) => organization.users)
  @JoinTable({
    name: 'user_organizations',
    joinColumn: {
      name: 'user_id',
      referencedColumnName: 'id',
    },
    inverseJoinColumn: {
      name: 'organization_id',
      referencedColumnName: 'id',
    },
  })
  organizations: Organization[];

组织实体

@Entity({ name: 'organizations' })
export class Organization {
  @PrimaryColumn()
  id: string;

  @Column()
  name: string;

  @ManyToMany((type) => User, (user) => user.organizations)
  users: User[];

}

我的目标是创建一种关系,它不仅定义了哪个用户与哪个组织相关,它还应该包含用户与组织相关的角色信息。我的想法是用一个额外的role列来扩展关系表。

create table user_organizations(
  user_id varchar(64) not null,
  organization_id varchar(64) not null,
  role varchar(64) not null,
  foreign key (user_id) references users(id),
  foreign key (organization_id) references organizations(id),
);

我的问题是如何将角色存储在数据库中。目前我正在做这样的事情。

let user = new User();
let organization = new Organization();
organization.name = name;
organization.users = [user];
organization = await this.organizationRepository.save(organization);

如何role通过 TypeORM 填充该列?

标签: typescriptormtypeorm

解决方案


解决此类问题的最佳方法是单独创建一个单独的表Role,然后在user_organizations.

但是考虑一下这种情况——如果用户没有一个角色怎么办?它可以而且确实会发生。话虽如此,我的建议是处理桌子之外的角色。user_organisations由于该表是M2M,因此主键将是User.ID和的组合Organisation.ID。我的建议是:

  1. 为所有角色(如用户或组织)创建单独的表
  2. Roles在和之间创建 M2M 表UserOrganisations

推荐阅读