嗨朋友们,这是我的函数,它获取一个 id 数组,我想一笔画删除行而不是在循环中运行,并且找不到解决方案。 将不胜感激帮助。
async remove(ids: DeleteEmployeeAnswerDTO): Promise<boolean> {
if (ids.employeeAnswersIds.length) {
for (const id of ids.employeeAnswersIds) {
await EmployeeAnswers.delete(id.id);
}
}
return true;
}
如果您的表只有一个
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;
}
您可以搜索多个记录,然后删除在单个操作中找到的实体。如果未找到一个或多个实体,则不会删除任何内容。
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);
}
之前我也遇到过同样的问题。 如果您使用 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)
我希望它对某人有用。
我能够使用这个实现这一目标:
const items = req.body.linesIds.map((id) => ({ id, companyId: req.$USER?.companyId }))
// @ts-expect-error
const dbRes = await Line.delete(items)
这发送了一个查询,尽管它给出了类型错误,但它工作得很好,我相信这是 TypeORM 类型拘留中需要改变的事情
使用“清除”方法清除表中记录的所有数据!
async deleteProducts() {
await this.productRepository.clear();
return {
message: MESSAGE.PRODUCTS_REMOVED
};
}