4

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())
        {   
            //...
        }
    }        
    //...
}
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、 my からの制約を試してくださいValidatorBundle

バンドルをインストールし、制約をインポートします。

use Elnur\ValidatorBundle\Validator\Constraints\UniqueEntityCaseInsensitive;

そしてあなたを交換してください

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

@UniqueEntityCaseInsensitive(fields={"country", "description"})
于 2012-04-12T04:43:30.780 に答える