4

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

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

/**
 * @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'

更新:我发现这是 Doctrine 2.1 中的一个已知错误,已在 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())
        {   
            //...
        }
    }        
    //...
}
4

1 回答 1

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"})
于 2012-04-12T04:43:30.780 回答