2016-09-29 54 views
0

我想建立一個唯一約束的字段「用戶名」和「電子郵件」,但它不工作:FOSUserBundle獨特的實體約束

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 '[email protected]' pour la clef 'UNIQ_B85835ACA0D96FBF' 

出了什麼問題?

+0

請看這裏:http://stackoverflow.com/questions/8545561/unique-constraints-in-doctrine-2-symfony-2# 12643186 –

+0

不,它不適用於多列。 – Cliffe

回答

0

令人遺憾的是Symfony的驗證組件中有一個關於UniqueEntity與繼承類一起使用的錯誤。它已在2012年報告過:https://github.com/symfony/symfony/issues/4087

我從來沒有嘗試過,但可以使用repositoryMethod選項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); 
    } 
}