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

Oha*_*har 9 postgresql node.js typescript typeorm

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

async remove(ids: DeleteEmployeeAnswerDTO): Promise<boolean> {
        if (ids.employeeAnswersIds.length) {
            for (const id of ids.employeeAnswersIds) {
                await EmployeeAnswers.delete(id.id);
            }
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

jac*_*son 11

如果您的表只有一ID列,那么您应该能够传递 s 数组ID

await EmployeeAnswers.delete(ids.employeeAnswersIds);
Run Code Online (Sandbox Code Playgroud)

您还可以ID使用以下方式在 where 子句中指定多个 s In

await EmployeeAnswers.delete({ id: In(ids.employeeAnswersIds) });
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)