【问题标题】:FOSUserBundle Unique Entity constraintsFOSUserBundle 唯一实体约束
【发布时间】:2016-09-29 15:09:28
【问题描述】:

我想在“用户名”和“电子邮件”字段上设置唯一约束,但它不起作用:

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'

怎么了?

【问题讨论】:

标签: forms symfony doctrine fosuserbundle


【解决方案1】:

遗憾的是,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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2017-06-13
    • 1970-01-01
    • 2011-05-23
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多