symfony 2具有关联的唯一约束验证

时间:2012-04-12 03:57:53

标签: symfony doctrine doctrine-orm

我无法验证两个字段的“唯一性”,其中一个字段是关联的实体。逻辑是,对于一个国家,不能有两种具有相同描述的税。

这是我的(失败的)尝试:

/**
 * @ORM\Entity
 * @ORM\Table(name="taxes", uniqueConstraints={@ORM\UniqueConstraint(columns={"country_id", "description"})})
 * @UniqueEntity(fields={"country", "description"})
 */

class Tax
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO") 
     */
    protected $id;

    /**
     * @ORM\Column()         
     */
    protected $description;

    /**
     * @ORM\Column(type="float")
     */
    protected $value;

    /**
     * @ORM\ManyToOne(targetEntity="Country", inversedBy="taxes")
     */
    protected $country;

    //getters and setters...
}

当我使用重复的税务实体测试我的应用时,表单会通过验证(当它不应该时),Symfony会抛出错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-ITBMS' for key 'country_id'

UPDATE :我发现这是Doctrine 2.1中已知的bug,已在Doctrine 2.2中修复。不幸的是,Symfony 2.0.11(我目前的版本)附带了Doctrine 2.1,我不知道如何正确更新我的deps文件

更新2 :更新我的deps和deps.lock文件以获取最新的Doctrine 2.2.1文件,如下所示@elnur,问题仍然存在:复合唯一键是在数据库但验证未正确执行。单独升级Doctrine文件并不能解决问题。

更新3 :我甚至将Symfony核心更新到2.0.12版本,但它也没有解决问题。

更新4(求助):我在控制器中发现错误。这是我原来的控制器代码:

public function createAction($country_id)
{
    //...        

    if($request->getMethod() == 'POST')
    {
        $form->bindRequest($request);
        $tax->setCountry($country); //HERE IS THE ERROR...

        if($form->isValid())
        {   
            //...
        }
    }        
    //...
}

在绑定请求之前设置国家/地区是解决方案。

public function createAction($country_id)
{
    //...        

    if($request->getMethod() == 'POST')
    {            
        $tax->setCountry($country); //NOW IT WORKS...
        $form->bindRequest($request);            

        if($form->isValid())
        {   
            //...
        }
    }        
    //...
}

1 个答案:

答案 0 :(得分:3)

要升级到Doctrine 2.2.1,请将deps文件中的相关条目替换为:

[doctrine-common]
    git=http://github.com/doctrine/common.git
    version=2.2.1

[doctrine-dbal]
    git=http://github.com/doctrine/dbal.git
    version=2.2.1

[doctrine]
    git=http://github.com/doctrine/doctrine2.git
    version=2.2.1

并在deps.lock中加上这些:

doctrine-common 2.2.1
doctrine-dbal 2.2.1
doctrine 2.2.1

然后运行:

bin/vendors install

<强>更新

由于升级Doctrine不起作用,请尝试UniqueEntityCaseInsensitive中的ValidatorBundle约束。

安装捆绑包,导入约束:

use Elnur\ValidatorBundle\Validator\Constraints\UniqueEntityCaseInsensitive;

并替换你的

@UniqueEntity(fields={"country", "description"})

@UniqueEntityCaseInsensitive(fields={"country", "description"})