TypeORM 中的多对多连接

Many to Many Joins in TypeORM

我们目前正在针对我们的数据库实施 NestJS。我们决定使用 TypeORM 来为我们提供强大的 ORM,以用于我们的大多数基本到中级查询。但是,我在我们的实体中建立一种特定关系时遇到问题。

我们的 table 结构来自无法修改的现有系统。具体如下:

员工Table

+-----------+-----------+---------------+
| HRCO (PK) | HRRef(PK) | udDisplayName |
+-----------+-----------+---------------+
|         2 |       323 | John          |
|         2 |       500 | Larry         |
|         1 |        29 | Jim           |
+-----------+-----------+---------------+
**Skill Table**
+----------+----------+----------------+
| HRCo(PK) | Code(PK) |  Description   |
+----------+----------+----------------+
|        2 | CODE1    | Test Class     |
|        2 | CODE2    | Crane Training |
|        1 | CODE1    | Truck Training |
+----------+----------+----------------+
**Join Table - EmployeeSkills**
+-----------+---------------+-----------+------------+
| HRCO (FK) | Employee (FK) | Code (FK) |  Expires   |
+-----------+---------------+-----------+------------+
|         2 |           323 | CODE1     | 2019-01-01 |
|         2 |           323 | CODE2     | 2020-01-01 |
|         1 |            29 | CODE1     | 2020-01-01 |
+-----------+---------------+-----------+------------+

我知道这是一个具有复合外键的多对多关系。大多数 NestJS 文档都会引导您使用 ManyToMany 和 OneToMany x 2 模式来建立关系。但是,这些似乎只有在连接器 table 每个 table 而不是组合键有一个键的情况下才有效。

现在我的 类 看起来像下面这样:

技能

import { Entity, Column, PrimaryColumn, ManyToOne, OneToMany } from "typeorm";
import { EmployeeToSkillEntity } from "../employee-to-skill/employee-skill.entity";

@Entity({name:"skills"})
export class SkillEntity {

  @PrimaryColumn({ name: "HRCo" })
  company: number;

  @PrimaryColumn({ name: "Code" })
  code: number;

 

  @Column({name:"Description"})
  description: Date;

  @OneToMany(type => EmployeeToSkillEntity, employeeToSkill => employeeToSkill.code)
  employeeToSkills: EmployeeToSkillEntity[]

}

员工

import { Entity, Column, PrimaryColumn, OneToMany } from "typeorm";
import { EmployeeToSkillEntity } from "../employee-to-skill/employee-skill.entity";

/**
 * @ignore
 */
@Entity({name:"employee"})
export class EmployeeEntity {
  @PrimaryColumn({ name: "HRCo" })
  company: number;

  @PrimaryColumn({ name: "HRRef" })
  employeeNumber: number;

  @Column({name: "udDisplayName"})
  displayName: string;

  @OneToMany(type => EmployeeToSkillEntity, employeeToSkill => employeeToSkill.employee)
  employeeToSkills: EmployeeToSkillEntity[]

}

import { Entity, Column, PrimaryColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
import { EmployeeEntity } from "../employee/employee.entity";
import { SkillEntity } from "../skill/skill.entity";

/**
 * @ignore
 */
@Entity({ name: "employeeskills" })
export class EmployeeToSkillEntity {
  @PrimaryColumn({ name: "HRCo" })
  companyNumber: number;

  @PrimaryColumn({ name: "HRRef" })
  employeeNumber: number;

  @PrimaryColumn({ name: "Code" })
  code: string;

  @Column({ name: "CertDate" })
  certDate: Date;

  @Column({ name: "ExpireDate" })
  expireDate: Date;

  @Column({ name: "SkillTester" })
  skillTester: string;

  @Column({ name: "HistSeq" })
  histSeq: string;

  @Column({ name: "Notes" })
  notes: string;

  @Column({ name: "UniqueAttchID" })
  attachmentID: number;

  @Column({ name: "Type" })
  type: string;

  @Column({ name: "KeyID" })
  keyID: number;

  @Column({ name: "udLastModDate" })
  lastModifiedDate: Date;

  @Column({ name: "udLicense" })
  license: number;

  @ManyToOne(type => EmployeeEntity, (employee) => employee.employeeToSkills)
  @JoinColumn([{ name: "HRCo", referencedColumnName: "companyNumber" }, { name: "HRRef", referencedColumnName: "employeeNumber" }])
  employee: EmployeeEntity;

  @ManyToOne(type => SkillEntity, (skill) => skill.employeeToSkills)
  @JoinColumn([{ name: "HRCo", referencedColumnName: "companyNumber" }, { name: "Code", referencedColumnName: "code" }])
  skill: SkillEntity;
}

但是,我在生成查询时遇到错误,因为我正在获取关系列 + 属性 名称,如“skillCode”。

如有任何帮助,我们将不胜感激。

谢谢

为了正确地 'configure' TypeORM 被 Nest.js 使用,考虑 @JoinTable 也支持复合键。请试一试(希望从你的问题来看,这是查询本身的问题,并且正确地通过连接 table - @JoinTable 可能已经帮助你了)并且它仍然有问题,拜托使用您收到的确切查询和错误更新代码。来自 TypeORM 调试模式的任何日志也很好。

干杯!

将 JoinColumn() 添加到 ManyToOne 关系是关键。

您需要将当前 class 的列设为关联实体的 属性 。您必须为关系中的每个 FK 执行此操作。