我有软删除和独特的实体字段。它工作得很好但是......
如果记录被删除“softdeleted”,我无法创建相同的记录。我认为这是因为数据库中没有真正删除记录。但我需要这样做。
那么dothis的最佳方式是什么?
感谢您的建议
答案 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
以检查唯一性。
prePersist
和UniqueEntity
验证程序都可以使用此自定义存储库方法。
答案 2 :(得分:1)
您有三个选择
创建新实体时,将停用软可删除过滤器
$ EM-> getFilters() - >禁用( '软可删除');
这将让您找到“已删除”的项目。然后你可以做一些事情,比如覆盖旧条目,手动硬件删除或者你需要用它做什么。
答案 3 :(得分:0)
就我而言,我是这样使用的
删除数据库上列的唯一索引
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)');
}
在您的实体上添加此约束
/**
* @ORM\Entity(repositoryClass=AdminRepository::class)
* @ORM\Table(name="admins",
* uniqueConstraints={
* @UniqueConstraint(name="admins",
* columns={"email", "deleted_at"})
* })
这意味着您使 email
(唯一列)和 deleted_at
对唯一,而不仅仅是 email
字段。现在,如果旧管理员被删除(使用软删除)
email
创建另一个管理员