【问题标题】:TypeORM - How to insert into table with foreign key without fetching relation firstTypeORM - 如何在不先获取关系的情况下使用外键插入表
【发布时间】:2021-12-16 12:48:37
【问题描述】:

我正在使用 NestJSTypeORM 创建一个小型应用程序,但在插入具有复合外键的表时遇到问题。

每当执行插入时,所有列都会被填充,除了外键,外键保持为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

你能帮帮我吗?

【问题讨论】:

  • 我猜提供给.values 的对象必须遵循EmployeePayroll 的形状。因此,您需要将该 DTO 映射到 { employeePayrollName: employeePayroll.employeePayrollName:, employee: { id: employeePayroll.employeeId, version: employeePayroll.employeeVersion } } 您可以使用像 AutoMapper 这样的对象到对象映射器来执行此操作。
  • 是的,这就是问题所在。我现在已经设法让它工作了。感谢您的帮助。

标签: node.js nestjs typeorm


【解决方案1】:

根据@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 表中插入记录,如果我尝试在employee 对象中使用新的idversion,则会收到外键违规错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多