如何使用symfony 2使工作软删除和唯一实体

时间:2015-09-17 07:42:38

标签: symfony unique soft-delete

我有软删除和独特的实体字段。它工作得很好但是......

如果记录被删除“softdeleted”,我无法创建相同的记录。我认为这是因为数据库中没有真正删除记录。但我需要这样做。

那么dothis的最佳方式是什么?

  1. Totaly删除了记录?那么softdeletable是一个不错的选择吗?
  2. 找到一种方法,如果记录是软删除的,我可以再次创建相同的记录
  3. 感谢您的建议

4 个答案:

答案 0 :(得分:3)

从数据库级别删除了唯一约束后,您可以将此设置为您的实体。

@UniqueEntity(fields={"name", "deleteTime"}, ignoreNull=false)

在这种情况下,如果您已经有"非软删除"则验证将失败。在数据库中具有给定名称的行,但如果设置了deleteTime则不会。

答案 1 :(得分:2)

由于您使用的是软删除和唯一约束,因此无法在数据库级别实际使用唯一约束。

我建议您手动处理唯一约束检查​​,这可以在doctrine life cycle event

中完成

执行此操作的一种方法是在您的实体中创建一个回调函数并对其进行注释以触发该事件:

/** @PrePersist */
public function prePersist(LifecycleEventArgs $args)
{
    $entity = $args->getObject();
    $entityManager = $args->getObjectManager();

    // check if this entity's unique field is OK
}

这只会确保您不会在数据库中保存任何不正确的内容,但它不能很好地处理您的表单。因此,您可能希望使用UniqueEntity validator进行此操作,并创建自定义repositoryMethod以检查唯一性。

prePersistUniqueEntity验证程序都可以使用此自定义存储库方法。

答案 2 :(得分:1)

您有三个选择

  • 硬删除项目
  • 删除唯一(并在学说中处理)
  • 创建新实体时,将停用软可删除过滤器

    $ EM-> getFilters() - >禁用( '软可删除');

这将让您找到“已删除”的项目。然后你可以做一些事情,比如覆盖旧条目,手动硬件删除或者你需要用它做什么。

答案 3 :(得分:0)

就我而言,我是这样使用的

  1. 删除数据库上列的唯一索引

     public function up(Schema $schema) : void
      {  
           $this->addSql('DROP INDEX UNIQ_A2E0150FE7927C74 ON admins');
            $this->addSql('CREATE UNIQUE INDEX UNIQ_A2E0150FE7927333 ON 
       admins (email,deleted_at)');
    

    }

  2. 在您的实体上添加此约束

    /**
      * @ORM\Entity(repositoryClass=AdminRepository::class)
      * @ORM\Table(name="admins",
      *    uniqueConstraints={
      *        @UniqueConstraint(name="admins",
      *            columns={"email", "deleted_at"})
      * })
    

这意味着您使 email(唯一列)和 deleted_at 对唯一,而不仅仅是 email 字段。现在,如果旧管理员被删除(使用软删除)

,我可以使用相同的 email 创建另一个管理员