【问题标题】:How to delete nested entities in TypeORM and Nest.js如何删除 TypeORM 和 Nest.js 中的嵌套实体
【发布时间】:2019-12-25 12:07:57
【问题描述】:

我有一对多的关系:

class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @OneToMany(() => Phone, phone => phone.user, {cascade: true})
    phones?: Phone[];
}

假设数据库中的当前数据如下:用户有两个电话号码:

{
  "id": 1,
  "name": "Jhon",
  "phones": [
    {"id": 1, "phone":  "123456"},
    {"id": 2, "phone":  "567809"}
  ]
}

我构建 UI(网络界面)并从网络界面中删除用户个人资料中的电话号码。所以我这样做了,以下 POST 请求来自 UI:第二个电话号码已删除

{
  "id": 1,
  "name": "Jhon",
  "phones": [
    {"id": 1, "phone":  "123456"}
  ]
}

如何从数据库中删除电话号码 id=2? 我使用 Nest CRUD 模块,正如我从源代码中了解到的那样,它只是将请求中的新数据与数据库中的当前数据合并,因此将数据库中的两个电话号码与请求中的唯一电话号码合并为我们再次提供电话号码数组,什么也没有已删除:皱眉: 我试着手动做,代码很多!

  @Override()
  async updateOne(
    @ParsedRequest() req: CrudRequest,
    @ParsedBody() dto: UpdateUserDto,
    @Param('id') id: number,
  ): Promise<Shipment> {

    // use standart Nest.js way to save new user data into database
    await this.service.updateOne(req, dto);

    // load fresh user data from database
    const user = await this.service.findOne(id);

    const phonesFromUi = dto.phones;
    const phonesToBeDeleted = [];
    // loop phone numbers from database - detect which to be deleted
    user.phones.forEach((phoneFromDb) => {
      const hasThisPhoneOnUi = phonesFromUi.find((phoneFromUi) => phoneFromUi.id === phoneFromDb.id);
      if (!hasThisPhoneOnUi) {
        // looks like this phone number was deleted on ui, so delete it from database too
        phonesToBeDeleted.push(phoneFromDb);
      }
    });
    // actually delete phone numbers from database
    await this.connection.getRepositoryFor(Phone).remove(phonesToBeDeleted);

    // reload fresh user data from database to get fresh list of phone numbers after delition some of them
    const user = await this.service.findOne(id);

    return user;
  }

有没有办法通过 TypeORM 内置函数或方法来做到这一点?如何从嵌套数组中删除一些元素?

【问题讨论】:

    标签: nestjs typeorm


    【解决方案1】:

    typeorm 对加入更新没有很好的支持,我建议你做的是接收电话参数并选择与 UserId 相关的电话,然后删除不在其中的 id新数组:

    const phones = await this.phoneRepository.find({userId:1});
    const toDeletePhones = phones.filter((element)) => {
      return updatePhones.indexOf(element) === -1;
    }
    this.phoneRepository.remove(toDeletePhones);
    

    然后继续更新用户,或者你甚至可以在此之前完成它

    【讨论】:

    • 感谢您的回复。我现在实际上也在做同样的事情 - 手动过滤手机数组并删除那些不在 UI 请求中的手机。所以,至少现在我知道 TypeORM 没有更好的方法了。
    猜你喜欢
    • 2022-11-11
    • 2020-06-17
    • 1970-01-01
    • 2021-01-27
    • 2021-01-05
    • 1970-01-01
    • 2021-03-08
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多