本文介绍了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唯一实体约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!