[英]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.