2012-08-17 47 views
7

我有以下的实体类在我的应用程序:为什么我的Symfony2 @UniqueEntity约束根本无法工作?

<?php 

namespace ...; 

// use ... 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;; 
// ... 

/** 
* @ORM\Table(name="sc_user") 
* @ORM\Entity(repositoryClass="...\UserRepository") 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity(fields={"email", "username"}) 
*/ 
class User implements UserInterface, \Serializable, EquatableInterface 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * 
    * @Assert\NotBlank(groups={"registration"}) 
    * @Assert\Email(groups={"registration"}) 
    */ 
    private $email; 

    /** 
    * @var string $username 
    * 
    * @ORM\Column(name="username", type="string", length=32, unique=true) 
    * 
    * @Assert\NotBlank(groups={"registration"}) 
    */ 
    private $username; 

    // ... 
} 

的@UniqueEntity约束被忽略。我尝试不同的口味,包括:

@UniqueEntity(fields={"email", "username"}) 

@UniqueEntity(fields={"email"}) 
@UniqueEntity(fields={"username"}) 

,并按照这里的Symfony2的文档:http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

@UniqueEntity("email") 
@UniqueEntity("username") 

没有我这样做,工作。非但没有如预期的表单验证错误的,我得到以下异常:

SQLSTATE [23000]:完整性约束违规:1062重复条目 “[email protected]”关键“UNIQ_D8183973E7927C74”

这是错的!有谁知道如何解决这个问题?

回答

20

问题解决如下:

@UniqueEntity(fields={"email"}, groups={"registration"}) 
@UniqueEntity(fields={"username"}, groups={"registration"}) 

注册组人失踪,我需要把它们分开成两个单独的注释。

+0

+1感谢!那工作的一种享受! – coder4show 2013-06-25 15:44:12

+2

嗨,Josef,似乎有点老问题,但我遇到同样的问题 - 只是想知道 - 你需要,我不知道,__create__验证组在某处?我完全按照你的方式添加了唯一的实体字段,只能在电子邮件和手机上添加,但它仍然给我一个异常而不是验证错误。有任何想法吗? – iLikeBreakfast 2014-01-07 19:57:15

+1

@iLikeBreakfast您需要在FormType中的setDefaultOptions方法中声明验证组。 – ferdynator 2014-07-30 12:46:46

1

尝试添加

framework: 
    validation: 
     enable_annotations: true 

到您的应用程序配置

11

此问题的另一个原因是,如果您使用表单集合并包含处理关联实体的子表单,则必须在根和所有子表单中将cascade_validation设置为true

看到Symfony documentation提示:

要在CategoryType激活验证,添加cascade_validation选项TaskType

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Acme\TaskBundle\Entity\Task', 
     'cascade_validation' => true, 
    )); 
} 

更新:

为了确保你的孩子实体得到验证,甚至有更好的方法。正因如此,Symfony提供了Valid约束。从documentation

有效
这个约束用于启用对作为对象的属性被验证被嵌入的对象的验证。这使您可以验证对象及与其关联的所有子对象。

+0

这是这里只有有用和正确的答案。 – VisioN 2015-12-03 19:26:43

3

请注意ignoreNull

例如与PID正常工作(可以为null):

constraints: 
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
    fields: [page, pid, position] 
    errorPath: page 
    groups: [Menu] 
    message: "Page already exists with that parent" 
    ignoreNull: false 
+0

这是我的问题的答案。谢谢! – nataliastanko 2016-03-08 15:34:34

相关问题