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