簡體   English   中英

如何刪除 TypeORM 和 Nest.js 中的嵌套實體

[英]How to delete nested entities in TypeORM and Nest.js

我有一對多的關系:

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 內置函數或方法來做到這一點? 如何從嵌套數組中刪除一些元素?

在 typeorm 中沒有很好的支持做 join 更新,我建議你做的是接收電話參數並選擇與 UserId 相關的電話,然后刪除不在新數組中的 id :

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

然后繼續更新用戶,或者你甚至可以在此之前進行

暫無
暫無

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

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