Symfony - softdeleteable 删除实体但让我在之后查询
Symfony - softdeleteable delete the entity but let me query it after
我想在我的 symfony 应用程序中实现 softdelete
。
我正在使用 Symfony5
和 ApiPlatform
作为后背。
我已经 运行 下面的命令来安装包
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
我想在我的 symfony 应用程序中实现 softdelete
。
我正在使用 Symfony5
和 ApiPlatform
作为后背。
我已经 运行 下面的命令来安装包
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