TypeORM @JoinTable() 如何指定自定义连接列?

Sim*_*low 3 typeorm

这是我的示例数据模型

在此输入图像描述

我已经声明了以下类:

@Entity({
  name: 'user'
})
export class User {
  @Column({ type: 'int4' })
  @PrimaryColumn()
  userid: number
    
  @Column({name: 'name', type: 'varchar', length: 30})
  name: string
    
  @Column({name: 'age', type: 'int2'})
  age: number
    
  @ManyToMany(() => Department, (department)=> department.users)
  @JoinTable({
    name: 'department_user'
  })
  departments: Department[]
}

@Entity({ name: 'department' })
export class Department {
    
  @Column({ type: 'int2' })
  @PrimaryColumn()
  departmentid: number
    
  @Column({type: 'varchar', length: 50})
  title: string
    
  @Column({type:'text'})
  notes: string
    
  @ManyToMany(() => User, (user)=> user.departments)
  @JoinTable({ name: 'department_user' })
  users: User[]  
}
Run Code Online (Sandbox Code Playgroud)

每当我运行该应用程序时,它都会创建DepartmentDepartmentIduserUserId列,而不使用相应联接表中的列。如何告诉 typeorm 仅使用连接表中预定义的连接列?

更新 2(如 @suvantorw 提到的)

我使用以下语句重新创建了连接表:

create table department_user(
departmentid integer not null, 
userid integer not null);

alter table department_user add constraint fk_dept_dept foreign key (departmentid) references department(departmentid);
alter table department_user add constraint fk_dept_user foreign key (userid) references "user"(userid);
alter table department_user add constraint pk_dept_user primary key (departmentid, userid);
Run Code Online (Sandbox Code Playgroud)

并修改实体如下:

用户

create table department_user(
departmentid integer not null, 
userid integer not null);

alter table department_user add constraint fk_dept_dept foreign key (departmentid) references department(departmentid);
alter table department_user add constraint fk_dept_user foreign key (userid) references "user"(userid);
alter table department_user add constraint pk_dept_user primary key (departmentid, userid);
Run Code Online (Sandbox Code Playgroud)

部门

  @ManyToMany(() => Department, (department)=> department.users)
  @JoinTable({ 
    name: 'department_user',
    joinColumn: { name: 'userid' },
    inverseJoinColumn: { name: 'departmentid' }
  })
  departments: Department[]
}
Run Code Online (Sandbox Code Playgroud)

它运行时没有错误,但是当它运行时,表结构被修改为这样 修改表结构

正如您所看到的,,y 外键约束消失了,并且创建了新的外键约束。知道我在这里做错了什么吗?

更新3

最后,我修改了类,如下所示,现在 TypeORM 接受关系并且不创建自己的关系。解决这个问题是一次非常痛苦的经历,而且关于这个装饰器的文档也没有说太多。

用户

  @ManyToMany(() => User, (user)=> user.departments)
  @JoinTable({
    name: 'department_user',
    joinColumn: { name: 'departmentid' },
    inverseJoinColumn: { referencedColumnName: 'userid' }
  })
  users: User[]  
}
Run Code Online (Sandbox Code Playgroud)

部门

  @ManyToMany(() => Department, (department)=> department.users)
  @JoinTable({ 
    name: 'department_user',
    joinColumn: {
      name: 'userid',
      foreignKeyConstraintName: 'fk_dept_user'
    },
    inverseJoinColumn: {
      referencedColumnName: 'departmentid',
      name: 'departmentid',
      foreignKeyConstraintName: 'fk_dept_dept'
    }
  })
  departments: Department[]
}
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以指定连接列名称和反向连接列名称。像这样的东西应该适合你:

@ManyToMany(() => Department, (department)=> department.users)
@JoinTable({ 
    name: 'department_user',
    joinColumn: { name: 'userid' },
    inverseJoinColumn: { name: 'departmentid' }
})
departments: Department[]
Run Code Online (Sandbox Code Playgroud)