Symfony - softdeleteable 删除实体但让我在之后查询

Symfony - softdeleteable delete the entity but let me query it after

我想在我的 symfony 应用程序中实现 softdelete

我正在使用 Symfony5ApiPlatform 作为后背。

我已经 运行 下面的命令来安装包

composer require stof/doctrine-extensions-bundle

安装工作 composer.json 现在有:

"stof/doctrine-extensions-bundle": "^1.5",

所以我更新了我的 stof_doctrine_extensions.yaml 文件如下:

stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            softdeleteable: true

我将 @Gedmo 注释添加到我要在 softdeleteable 上应用的实体

添加了 deletedAt 字段,生成迁移并重新加载数据库。

这是我的 Entity.php 文件:

/**
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false, hardDelete=false)
 * @ORM\Entity(repositoryClass=EntityRepository::class)
 */
class Entity
{

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"entity:read", "entity:list", "user:read", "user:list"})
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"entity:write", "entity:read", "entity:list"})
     */
    protected $firstName;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $deletedAt;
}

我还编写了一个简单的测试来查看该功能是否正常工作:

public function testRoleAdminCanSoftDeleteEntity(): void
   {
        $this->buildEntityManager();

        $res = $this->buildDeleteRequest(
            GenericRoutes::ROUTE.'/11',
            GenericCredentials::ADMIN_CREDENTIALS
        );

        $entity = $this->em->getRepository(Entity::class)->findEntityByEntityField(json_decode(GenericCredentials::CREDENTIALS)->email);

        $this->assertNull($entity);

        $this->assertResponseIsSuccessful();
        $this->assertResponseStatusCodeSame(204);

    }

我收到了 204 但专家不是空的。

我也曾使用swagger手动删除了我想删除的entity/{id}

我也收到一个 204,然后可以立即查询相同的 entity/{id}

我已经在数据库中进行了验证,deleted_at 字段已更新到我 运行 DELETE 请求的那一刻。

有谁知道为什么我仍然可以查询我刚刚软删除的 user

所以,关于我的评论。

你只需要在 doctrine config 中配置 filter 即可,如下所示:

doctrine:
    dbal:
      ...
    orm:
      ...
        filters:
            softdeleteable:
                class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                enabled: true

但在我看来,不使用这个扩展会容易得多,它只是你项目中的一个依赖项,只需创建你自己可以为实体 deletedAt 属性并在删除时将其设置为 DateTime('now'),然后您只需向 findBy 添加一个条件即可从存储库中获取未删除的条目 - 'deletedAt' => null