如何删除多行typeorm - postgresql&node.js(typescript)

问题描述 投票:0回答:5

嗨朋友们,这是我的函数,它获取一个 id 数组,我想一笔画删除行而不是在循环中运行,并且找不到解决方案。 将不胜感激帮助。

async remove(ids: DeleteEmployeeAnswerDTO): Promise<boolean> {
        if (ids.employeeAnswersIds.length) {
            for (const id of ids.employeeAnswersIds) {
                await EmployeeAnswers.delete(id.id);
            }
        }
        return true;
    }
node.js postgresql typescript typeorm
5个回答
11
投票

如果您的表只有一个

ID
列,那么您应该能够传递
ID
数组:

await EmployeeAnswers.delete(ids.employeeAnswersIds);

您还可以使用

ID
:
 在 where 子句中指定多个 
In

await EmployeeAnswers.delete({ id: In(ids.employeeAnswersIds) });

但是,如果您处理具有复合主键的表(就像我的情况一样),以下示例可以为您提供解决方案。我对这个答案并不着迷,但这是我如何使用

DeleteQueryBuilder
(docs) 克服这个问题的方法:

async remove(ids: DeleteEmployeeAnswerDTO): Promise<boolean> {
  if (ids.employeeAnswersIds.length) {
    const deleteQueryBuilder = EmployeeAnswer.createQueryBuilder().delete()

    const idClauses = ids.map((_, index) => `ID = :id${index}`)
    const idClauseVariables = ids.reduce((value: any, id, index) => {
      value[`id${index}`] = id
      return value
    }, {})

    await deleteQueryBuilder.where(idClauses.join(' OR '), idClauseVariables).execute()
  }
  return true;
}

1
投票

您可以搜索多个记录,然后删除在单个操作中找到的实体。如果未找到一个或多个实体,则不会删除任何内容。

async removeMany(ids: string[]) {
    const entities = await this.entityRepository.findByIds(ids);
    if (!entities) {
      throw new NotFoundException(`Some Entities not found, no changes applied!`);
    }
    return this.entityRepository.remove(entities);
  }

0
投票

之前我也遇到过同样的问题。 如果您使用 NestJS + typeorm,我的案例可能会有所帮助。

这是一个模块:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

import { TaskController } from './task.controller';
import { Task } from './task.entity';
import { TaskService } from './task.service';

@Module({
  imports: [TypeOrmModule.forFeature([Task])],
  controllers: [TaskController],
  providers: [TaskService],
  exports: [TaskService],
})
export class TaskModule {}

这是我的控制器的一部分:

import { Controller, Delete, Query, Request } from '@nestjs/common';
import { TaskService } from './task.service';


@Controller('task')
export class TaskController {
  constructor(private taskService: TaskService) {}

  @Delete('/multiple/')
  async deleteMultiple(@Request() req, @Query('ids') ids: string[]) {
    const userId = req.user.id;

    try {
      await this.taskService.deleteMultiple(userId, ids);

      return 'success';
    } catch (error) {
      return 'error';
    }
  }
}

这里有一项服务:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { In, Repository } from 'typeorm';

@Injectable()
export class TaskService {
  constructor(@InjectRepository(Task) private repo: Repository<Task>) {}

  async deleteMultiple(userId: string, taskIds: string[]) {
    return await this.repo.delete({ userId, id: In(taskIds) });
  }
}

所以,解决方案是 In(taskIds)

我希望它对某人有用。


0
投票

我能够使用这个实现这一目标:

const items = req.body.linesIds.map((id) => ({ id, companyId: req.$USER?.companyId }))
// @ts-expect-error
const dbRes = await Line.delete(items)

这发送了一个查询,尽管它给出了类型错误,但它工作得很好,我相信这是 TypeORM 类型拘留中需要改变的事情


-2
投票

使用“清除”方法清除表中记录的所有数据!

async deleteProducts() {
  await this.productRepository.clear();
  return {
    message: MESSAGE.PRODUCTS_REMOVED
  };
}

© www.soinside.com 2019 - 2024. All rights reserved.