網站搜尋

typescript - 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);

我如何也能通過 TypeORM 填寫 role 欄位?

答案#1

處理這類問題的最佳方法是為 Role 創建一個單獨的表,然後在 user_organizations 中引用這個表。

但想想這個情況——如果一個使用者不只擁有一個角色呢?這種情況是有可能發生的。也就是說,我的建議是將角色的處理放在 user_organisations 表之外。由於該表是 M2M,其主鍵將是 User.ID 和 Organisation.ID 的組合。我建議的是:

  1. 為所有角色(如使用者或組織)建立獨立的表格
  2. 在 Roles 和 UserOrganisations 之間建立 M2M 表