如何从typeorm PostgreSQL中获取软删除实体?

qjp7pelc  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(6)|浏览(268)

我尝试使用typeormfind, findOne or query builder get/getMany方法从postgreSQL数据库中获取软删除的文档,但它总是返回undefined。是否有方法获取已删除的值?
根据文档,它应该只为deletedAt设置一个时间戳,而且它肯定有效,因为我可以使用update where from query builder更新相同的记录。

8dtrkrch

8dtrkrch1#

我发现还有另一种解决方案。你可以使用querybuilders .withDeleted()方法来返回软删除的实体。
示例

const query = await this.manager
        .getRepository(FolderEntity)
        .withDeleted() 
        .createQueryBuilder('folder')
        .leftJoinAndSelect('folder.subStatus', 'status')
        .getMany()
vfh0ocws

vfh0ocws2#

实际上,引用findOptions doc,您可以传递withDeleted布尔值,它将检索软删除的行。
例如:

const result = await this.repo.find({ where: { id }, withDeleted: true })
2j4z5cfb

2j4z5cfb3#

经过更多的搜索,我发现唯一的解决方案是使用原始SQL查询,因为它是在查询块的typeorm文档中显示的。

const deletedEntity = await connection
    .getRepository(Entity)
    .query(`SELECT * FROM Entity where id = '${deletedEntityId}'`)

此查询返回带有deletedAt时间戳的值。

jw5wzhpr

jw5wzhpr4#

const queryBuilder = await this.yourRepository.createQueryBuilder('entity');
queryBuilder.withDeleted();
queryBuilder.where(`entity.deleted_at IS NOT NULL`)};
ht4b089n

ht4b089n5#

await getManager().transaction(async (em) => {
    await em.update(Faqs, { id }, { updatedAt: userId });
    await em.softDelete(Faqs, id);
});
nfs0ujit

nfs0ujit6#

使用findfindOne,您可以使用以下命令执行此操作:

import { IsNull, Not } from 'typeorm';

//...
this.yourRepository.find({
  where: {
    deletedAt: Not(IsNull()),
  },
  withDeleted: true,
});

我认为这是优雅的,易于阅读,并避免使用查询构建器,这可能是不广泛使用的代码。

相关问题