使用TypeORM更新嵌套关系的正确方法是什么?

时间:2020-10-20 18:16:24

标签: nestjs typeorm

我试图搜索我的问题,但找不到任何东西,也许我是错误地处理了该问题。

我正在构建服务中的一个更新功能,该功能包含在REST API的修补程序端点中(使用NestJS),因为这是一个修补程序,所以我要查找的任何字段都是参数,应该在实体中进行更新,到目前为止效果很好。 现在出现了问题,我将其添加到相关模型中。

我拥有的(简化的)模型是:

主要实体正在与之合作:

Organization {
  id: number,
  name: string;

  @OneToMany(() => Offer, (offer: Offer) => offer.organization,
    {
      cascade: true,
      eager: true
    })
  offers: Offer[]
}

“优惠”模型基本上是“多对多”上的中间表,但由于我希望很快会添加一些其他字段,因此我还是以此方式对其进行了建模

Offer {
  id: number,
  
  @ManyToOne(() => Organization, (organization: Organization) => organization.id, {
    onDelete: 'CASCADE',
    nullable: false
  })
  @JoinColumn({
    name: 'organization_id',
    referencedColumnName: 'id'
  })
  organization: Organization;

  @ManyToOne(() => Category, (category: Category) => category.id, {
    eager: true,
    onDelete: 'CASCADE',
    nullable: false
  })
  @JoinColumn({
    name: 'category_id',
    referencedColumnName: 'id'
  })
  @AutoMap()
  category: Category;
}

类别仅包含一些信息(甚至没有OneToMany关系设置,因为我现在不担心看到该类别的所有优惠

Category {
  id: number,
  name: string
}

要编辑组织,我正在使用repository.preload()使用新的传入更新参数进行预加载,这将加载实体并根据新字段修改值。

但是在嵌套的商品上,它会加载以前存在的商品,以及新添加的(或修改的)商品,即使我传递商品的ID:

因此,如果我的请求正文为:

{
    "offers" : [
    {
        "id": 7,  // This one exists
        "category_id": 2 // And should modify this category
    },
    {
        "category_id": 3 // this is a new one I'd like to create
    }
    ]
}

我是否过度扩展了preload()可以实际完成的工作,并且我应该在没有关系的情况下加载实体并分别管理它们吗?还是通过这种方式可以实现?通常如何在Patch端点中编辑嵌套关系?

0 个答案:

没有答案