我有两个实体-财产和所有者。一个财产可以有很多所有者,而所有者可以有很多财产。对于联接,请使用property_owner表。如何使用NestJS / TypeORM更新这种多对多关系?
@Entity('property')
export class Property extends EntityModel {
@Column({ length: 255, nullable: false })
name: string;
@ManyToMany(type => Owner, { cascade: true })
@JoinTable({
name: 'property_owner',
joinColumn: { name: 'propertyId', referencedColumnName: 'id'},
inverseJoinColumn: { name: 'ownerId', referencedColumnName: 'id'},
})
owners: Owner[];
}
@Entity('owner')
export class Owner extends EntityModel {
@Column({ length: 255, nullable: false })
name: string;
@ManyToMany(type => Property, { cascade: true })
@JoinTable({
name: 'property_owner',
joinColumn: { name: 'ownerId', referencedColumnName: 'id'},
inverseJoinColumn: { name: 'propertyId', referencedColumnName: 'id'},
})
properties: Property[];
}
以下用于保存和更新服务的方法:
public create(req: Request): Promise<Dto> {
const dto: CreateDto = {
...req.body,
owners: this.formatJoinData(req.body.owners) //[1,2,3] => [{id:1},{id:2},{id:3}]
};
const entity = Object.assign(new Entity(), dto);
return this.repo.save(entity);
}
public update(req: Request): Promise<UpdateResult> {
const dto: EditDto = {
...req.body,
owners: this.formatJoinData(req.body.owners) //[1,2,3] => [{id:1},{id:2},{id:3}]
};
const id = req.params.id;
const entity = Object.assign(new Entity(), dto);
return this.repo.update(id, entity);
}
保存新媒体资源效果很好,但是当我尝试更新媒体资源时出现错误
[ExceptionsHandler] column "propertyId" of relation "property" does not exist
在两种情况下,所有者数据看起来都像[{id:1},{id:2},{id:3}]。我认为保存/更新方法结果存在问题。保存方法返回给我们带有ID的实体,更新方法返回给我们不包含实体ID的UpdateResult。但是也许我们可以在某个地方变换/另外定义该值...
答案 0 :(得分:0)
https://typeorm.io/#/many-to-many-relations文档只说了使用JoinTable
装饰器,而且我们不知道您在请求中有什么,但看起来您传递的是错误的值。这些字段是虚拟的,最后与m2m关系创建了第三个表来处理关系。
答案 1 :(得分:0)
我找到了解决方案。需要调用保存方法而不是更新。 就我而言,更新将类似于
import {plainToClass} from 'class-transformer';
public async update(req: Request): Promise<Dto> {
const found = await this.repo.findOneOrFail(req.params.id, {
relations: ['owners', 'electricMeter'],
});
const dto = {
...found,
...req.body,
owners: this.formatJoinData(req.body.owners) //[1,2,3] => [{id:1},{id:2},{id:3}]
updatedBy: this.getUser(req),
updatedDate: Date.now(),
};
return this.repo.save(plainToClass(Entity, dto));
}
此代码可以改进,但是认为主要思想很清楚。