TypeORM - 如何在不先获取关系的情况下使用外键插入 table
TypeORM - How to insert into table with foreign key without fetching relation first
我正在使用 NestJS and TypeORM 创建一个小应用程序,但我无法插入具有复合外键的 table。
每当执行插入时,所有列都会被填充,除了外键,它保持为 null
。
这是我的实体:
员工
import { Column, Entity, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm';
@Entity({ name: 'employees' })
export class Employee {
@PrimaryGeneratedColumn('uuid')
id: string;
@PrimaryColumn()
version: number;
@Column({ name: 'employee_name', type: 'varchar' })
employeeName: string;
@Column({ name: 'employee_salary', type: 'numeric' })
employeeSalary: string;
}
员工薪资
import {
Column,
Entity,
JoinColumn,
ManyToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { Employee } from '../../employee/entities/employee.entity';
@Entity({ name: 'employee_payrolls' })
export class EmployeePayroll {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'employee_payroll_name', nullable: true })
employeePayrollName: string;
@ManyToOne(() => Employee)
@JoinColumn([
{ name: 'employee_id', referencedColumnName: 'id' },
{ name: 'employee_version', referencedColumnName: 'version' },
])
employee: Employee;
}
员工薪资服务
这是执行插入的代码:
export class EmployeePayrollDTO {
employeePayrollName: string;
employeeId: string;
employeeVersion: number;
}
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { EmployeePayrollDTO } from 'src/employee-payroll/dto/employee-payroll.dto';
import { EmployeePayroll } from 'src/employee-payroll/entities/employee-payroll.entity';
import { Repository } from 'typeorm';
@Injectable()
export class EmployeePayrollService {
constructor(
@InjectRepository(EmployeePayroll)
private readonly employeeRepository: Repository<EmployeePayroll>,
) {}
async addEmployeePayroll(employeePayroll: EmployeePayrollDTO) {
return await this.employeeRepository
.createQueryBuilder()
.insert()
.into(EmployeePayroll)
.values(employeePayroll)
.execute();
}
}
问题
问题是当插入成功时,列的值:employee_id
和 employee_version
为空:
id
employee_payroll_name
employee_id
employee_version
53de51fd-6c9e-4b96-8906-edd1f6eea26c
Payroll 1
null
null
64b8a147-acee-4f43-9ea1-b64c2c036369
Payroll 2
null
null
你能帮帮我吗?
根据@Michael Levi 的评论,问题是我没有正确设置 employee
对象。
以下是对我有用的方法:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { EmployeePayrollDTO } from 'src/employee-payroll/dto/employee-payroll.dto';
import { EmployeePayroll } from 'src/employee-payroll/entities/employee-payroll.entity';
import { Repository } from 'typeorm';
@Injectable()
export class EmployeePayrollService {
constructor(
@InjectRepository(EmployeePayroll)
private readonly employeeRepository: Repository<EmployeePayroll>,
) {}
async addEmployeePayroll(employeePayroll: EmployeePayrollDTO) {
return await this.employeeRepository
.createQueryBuilder()
.insert()
.into(EmployeePayroll)
.values({
employeePayrollName: employeePayroll.employeePayrollName,
employee: {
id: employeePayroll.employeeId,
version: employeePayroll.employeeVersion,
},
})
.execute();
}
}
请注意,这只会在 EmployeePayroll
table 中插入记录,如果我尝试在 employee
中使用新的 id
或 version
] 对象,我收到外键违规错误。
我正在使用 NestJS and TypeORM 创建一个小应用程序,但我无法插入具有复合外键的 table。
每当执行插入时,所有列都会被填充,除了外键,它保持为 null
。
这是我的实体:
员工
import { Column, Entity, PrimaryColumn, PrimaryGeneratedColumn } from 'typeorm';
@Entity({ name: 'employees' })
export class Employee {
@PrimaryGeneratedColumn('uuid')
id: string;
@PrimaryColumn()
version: number;
@Column({ name: 'employee_name', type: 'varchar' })
employeeName: string;
@Column({ name: 'employee_salary', type: 'numeric' })
employeeSalary: string;
}
员工薪资
import {
Column,
Entity,
JoinColumn,
ManyToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { Employee } from '../../employee/entities/employee.entity';
@Entity({ name: 'employee_payrolls' })
export class EmployeePayroll {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'employee_payroll_name', nullable: true })
employeePayrollName: string;
@ManyToOne(() => Employee)
@JoinColumn([
{ name: 'employee_id', referencedColumnName: 'id' },
{ name: 'employee_version', referencedColumnName: 'version' },
])
employee: Employee;
}
员工薪资服务
这是执行插入的代码:
export class EmployeePayrollDTO {
employeePayrollName: string;
employeeId: string;
employeeVersion: number;
}
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { EmployeePayrollDTO } from 'src/employee-payroll/dto/employee-payroll.dto';
import { EmployeePayroll } from 'src/employee-payroll/entities/employee-payroll.entity';
import { Repository } from 'typeorm';
@Injectable()
export class EmployeePayrollService {
constructor(
@InjectRepository(EmployeePayroll)
private readonly employeeRepository: Repository<EmployeePayroll>,
) {}
async addEmployeePayroll(employeePayroll: EmployeePayrollDTO) {
return await this.employeeRepository
.createQueryBuilder()
.insert()
.into(EmployeePayroll)
.values(employeePayroll)
.execute();
}
}
问题
问题是当插入成功时,列的值:employee_id
和 employee_version
为空:
id | employee_payroll_name | employee_id | employee_version |
---|---|---|---|
53de51fd-6c9e-4b96-8906-edd1f6eea26c | Payroll 1 | null |
null |
64b8a147-acee-4f43-9ea1-b64c2c036369 | Payroll 2 | null |
null |
你能帮帮我吗?
根据@Michael Levi 的评论,问题是我没有正确设置 employee
对象。
以下是对我有用的方法:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { EmployeePayrollDTO } from 'src/employee-payroll/dto/employee-payroll.dto';
import { EmployeePayroll } from 'src/employee-payroll/entities/employee-payroll.entity';
import { Repository } from 'typeorm';
@Injectable()
export class EmployeePayrollService {
constructor(
@InjectRepository(EmployeePayroll)
private readonly employeeRepository: Repository<EmployeePayroll>,
) {}
async addEmployeePayroll(employeePayroll: EmployeePayrollDTO) {
return await this.employeeRepository
.createQueryBuilder()
.insert()
.into(EmployeePayroll)
.values({
employeePayrollName: employeePayroll.employeePayrollName,
employee: {
id: employeePayroll.employeeId,
version: employeePayroll.employeeVersion,
},
})
.execute();
}
}
请注意,这只会在 EmployeePayroll
table 中插入记录,如果我尝试在 employee
中使用新的 id
或 version
] 对象,我收到外键违规错误。