TypeORM中的多对多联接

时间:2019-09-17 11:29:58

标签: nestjs typeorm

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

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

员工表

Over Full Screen
+-----------+-----------+---------------+
| 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 |
+----------+----------+----------------+

我认识到这是一个具有复合外键的多对多关系。大多数NestJS文档都会引导您使用ManyToMany和OneToMany x 2模式建立关系。但是,这些似乎仅在联接器表为每个表具有一个键而不是组合键时才起作用。

现在我的课程如下:

技能

**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 |
+-----------+---------------+-----------+------------+

员工

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[]

}

但是,由于获取关系和属性名称(如“ skillCode”)的列,我在生成查询时遇到错误。

任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:0)

为了正确地“配置” Nest.js使用的TypeORM,请考虑@JoinTable,它也支持复合键。请尝试一下(希望,从您的问题来看,这是查询本身的问题,并且无法正确通过联接表-@JoinTable可能已经帮助您解决了该问题),仍然有问题,请使用更新代码您得到的确切查询和错误。来自TypeORM调试模式的任何日志也将很好。

干杯!

答案 1 :(得分:0)

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

您需要使当前类的列成为关联实体的属性。您必须为关系中的每个FK进行此操作。