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_idemployee_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 中使用新的 idversion ] 对象,我收到外键违规错误。