2 つのフィールドの「一意性」を検証するのに問題があり、そのうちの 1 つは関連付けのエンティティです。論理は、1 つの国に対して同じ説明を持つ 2 つの税金が存在することはできないということです。
これが私の(失敗した)試みです:
/**
* @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.2 で修正された Doctrine 2.1の既知のバグであることがわかりました。残念ながら、Symfony 2.0.11 (私の現在のバージョン) には Doctrine 2.1 が同梱されており、deps ファイルを適切に更新する方法がわかりません。
更新 2 : @elnur が以下に提案するように、最新の Doctrine 2.2.1 ファイルを取得するために deps および deps.lock ファイルを更新した後、問題はまだ残っています。データベースに複合一意キーが作成されますが、検証が正しく実行されません。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())
{
//...
}
}
//...
}