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 执行此操作。
我们目前正在针对我们的数据库实施 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 执行此操作。