本文介绍了FOSUserBundle唯一实体约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想在用户名和电子邮件字段上设置唯一约束,但是它不起作用:
I want to set up a unique constraint on the fields "username" and "email" but it doesn't work :
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验证,并且出现数据库错误:
The form is validated by symfony and i get database error :
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ '[email protected]' pour la clef 'UNIQ_B85835ACA0D96FBF'
出什么问题了?
推荐答案
Symfony的验证组件中有一个关于 UniqueEntity的错误
与继承的类一起使用。已经在2012年进行了报道:
Sadly there is a bug in Symfony's Validation Component concerning UniqueEntity
using with inherited classes. It's already reported in 2012: https://github.com/symfony/symfony/issues/4087
我从未尝试过,但是您可以使用 repositoryMethod
-option。
I've never tried it, but you can workaround it using the repositoryMethod
-option.
/**
* @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);
}
}
这篇关于FOSUserBundle唯一实体约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!