我想在字段上设置一个唯一约束" username"和"电子邮件"但它不起作用:
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Table(name="acteurs")
* @ORM\Entity(repositoryClass="UserBundle\Repository\ActeurRepository")
* @ORM\InheritanceType("JOINED")
* @UniqueEntity(fields="email", message="Cet email existe déjà.")
* @UniqueEntity(fields="username", message="Ce login existe déjà.")
*/
abstract class Acteur extends BaseUser { ... }
表单由symfony验证,我收到数据库错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ 'test@gmail.com' pour la clef 'UNIQ_B85835ACA0D96FBF'
有什么问题?
答案 0 :(得分:0)
可悲的是,Symfony的验证组件中有一个关于UniqueEntity
使用继承类的错误。它已于2012年报道:https://github.com/symfony/symfony/issues/4087
我从未尝试过,但你可以workaround it使用repositoryMethod
- 选项。
/**
* @ORM\Table(name="acteurs")
* @ORM\Entity(repositoryClass="UserBundle\Repository\ActeurRepository")
* @ORM\InheritanceType("JOINED")
* @UniqueEntity(fields="email", message="Cet email existe déjà.", repositoryMethod="findByUniqueEmail")
* @UniqueEntity(fields="username", message="Ce login existe déjà.", repositoryMethod="findByUniqueUsername)
*/
abstract class Acteur extends BaseUser { ... }
并将其添加到您的ActeurRepository
:
class ActeurRepository extends EntityRepository
{
public function findByUniqueEmail(array $criteria)
{
return $this->findBy($criteria);
}
public function findByUniqueUsername(array $criteria)
{
return $this->findBy($criteria);
}
}