我无法验证两个字段的“唯一性”,其中一个字段是关联的实体。逻辑是,对于一个国家,不能有两种具有相同描述的税。
这是我的(失败的)尝试:
/**
* @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())
{
//...
}
}
//...
}
答案 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"})