Symfony的学说UniqueEntity

问题描述:

我UniqueEntity领域的电子邮件和我用SoftDeleteableSymfony的学说UniqueEntity

 filters: 
     softdeleteable: 
      class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter 
      enabled: true 


* @Gedmo\SoftDeleteable(fieldName="deletedAt") 
* @UniqueEntity(
*  fields="email", 
*  errorPath="not valid", 
*  message="This email is already in use." 
*) 

,当在我的数据库我有用户与deletedAt一些日期和电子邮件中找到实体

$user_by_email = $em->getRepository('ArtelProfileBundle:Users')->findOneByEmail($email); 

我有空,还行吧。但是当我创建新用户时我有错误

Integrity constraint violation: 1062 Duplicate entry '[email protected]' for key 'UNIQ_1483A5E9E7927C74'", 

这是我的行为。但在刷新时出现错误,验证没有错误时。帮助

 $data = $request->request->all(); 
     $data = $this->get('serializer')->serialize($data, 'json'); 
     $user = $this->get('serializer')->deserialize($data, 'Artel\ProfileBundle\Entity\Users', 'json'); 

     if (count($errors = $this->get('validator')->validate($user)) > 0) { 
      $view = $this->view((string) $errors, 400); 

      return $this->handleView($view); 
     } 

     $em->persist($user); 
     $em->flush(); 

好了,你有email唯一约束,并尝试添加一个新用户与已经存在的电子邮件..这样的错误是非常合情合理的。

SoftDeleteable只是在数据库中添加一个标志,但不会更改唯一字段的管理方式。

但是,您可以做的是使emaildeleted_at为唯一,而不仅仅是email字段。只有当电子邮件地址相同的未删除行时,才会出现此错误。

或者,例如,当您“软删除”用户时,可以删除电子邮件。但我不推荐它。 “

+0

”你可以做的事情是让电子邮件和deleted_at是唯一的,而不仅仅是电子邮件字段。只有在电子邮件没有被删除的行时,你才会得到这个错误。“用这种方法的事情是,只要第二项被删除,这也会导致错误。 – xabbuh

+0

我想说,如果有人试图用已经存在于数据库中但已被软删除的电子邮件“注册”或“创建账户”,由OP确定,那么账户将被“取消删除”而不是比创建一个新的。但理论上,你是对的@xabbuh – tchap

+1

是的,我只是想澄清一点,因为你可能很容易忘记这种情况。 – xabbuh