簡體   English   中英

帶有連接表的 TypeORM 更新(一對多,多對一)

[英]TypeORM update with join table (One-To-Many, Many-To-One)

有兩個示例實體。

@Entity('companies')
export class Company {
  @PrimaryColumn({ name: 'id' })
  id: string;

  @Column({ name: 'name' })
  name: string;

  @OneToMany(() => employee, (employee) => employee.company)
  @JoinColumn({ name: 'id', referencedColumnName: 'company_id' })
  employees: Employee[];
}
@Entity('employees')
export class Employee {
  @PrimaryColumn({ name: 'id' })
  id: string;

  @Column({ name: 'name' })
  name: string;

  @ManyToOne(() => company, (employee) => company.employees, { eagar: true, cascade: true} )
  @JoinColumn({ name: 'company_id', referencedColumnName: 'id' })
  company: Company;
}

我為更新准備了如下實體。 (它可以更新我公司的信息或我的員工信息。)

const employee = new Employee();
employee.id = 'employee1';
employee.name = 'mike';

const companyEntity = await companyRepository.findByEmployeeId(employee_id);
companyEntity.name = 'stackoverflow';
companyEntity.employees = [employee];

await companyRepository.save(companyEntity);

如果這樣保存,會出現錯誤,因為 TypeORM 處理如下。 (這不是一個確切的錯誤。這是一個類似的錯誤。)

// (Before the update, All users with 'company1' company have been inquired.)
query: SELECT employee.id FROM employee WHERE employee.company_id = 'company1'
query: UPDATE employee SET company_id = NULL WHERE employee.id = 'employee2'
query: UPDATE employee SET company_id = NULL WHERE employee.id = 'employee3'
query failed: Column 'company_id' cannot be NULL

最終好像是公司所有用戶試圖查詢和更新導致的錯誤。

我應該怎么做才能使用保存方法更新員工?

檢查您的employee.entitiy文件,我認為您的關系可能不太正確:

// company.entity.ts

@Entity('companies')
export class Company {
  @PrimaryColumn({ name: 'id' })
  id: string;

  @Column({ name: 'name' })
  name: string;

  @OneToMany(() => Employee, (employee) => employee.company)
  employees: Employee[];
}
// employee.entity.ts

@Entity('employees')
export class Employee {
  @PrimaryColumn({ name: 'id' })
  id: string;

  @Column({ name: 'name' })
  name: string;

  @ManyToOne(() => Company, (company) => company.employees)
  @JoinColumn({
    name: 'company_id',
  })
  company: Company;
}

就我個人而言,在更新記錄時,我會這樣做——以您的employee為例:

// employee.service.ts

async updateEmployee(
    employeeId: string,
    updateEmployeeDto: UpdateEmployeeDto,
  ): Promise<Employee> {

    /**
    * This will stop the show and return a 404 if the employee cannot be found.
    */
    const employee = await this.getEmployeeById(employeeId); 

    const { name } = updateEmployeeDto;

    employee.name = name;

    try {
      await employee.save();
    } catch (err) {
      throw new InternalServerErrorException(err.message);
    }

    return employee;
  }

或者,如果我正在create ,它可能看起來像這樣:

// employee.service.ts

async createEmployee(createEmployeeDto: CreateEmployeeDto): Promise<Employee> {
    return await this.employeeRepository.createEmployee(createEmployeeDto);
}
// employee.repository.ts

async createUser(createEmployeeDto: CreateEmployeeDto): Promise<Employee> {
    const { name } = createEmployeeDto;

    const employee = this.create();

    employee.name = name;

    try {
      await employee.save();
    } catch (err) {
      throw new InternalServerErrorException(err.message);
    }

    return employee;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM