2011-12-13 11 views
5

私はフォームから送信されたエンティティの一意性を検証するために、複数のフィールドに対してUniqueEntity検証制約を使用しています。Symfony2 UniqueEntity複数のフィールド:偽陽性の検証?

/** 
* @ORM\Table(name="mytable") 
* @ORM\Entity 
* @DoctrineAssert\UniqueEntity(fields = {"fieldA", "fieldB"}) 
*/ 
class myClass 
{ 
    /** 
    * @ORM\Column(name="fieldA", type="string", length=128, unique=true) 
    */ 
    protected $fieldA; 

    /** 
    * @ORM\Column(name="fieldB", type="string", length=128, unique=true) 
    */ 
    protected $fieldB; 
} 

が思う私はすでに値でデータベースのレコードを持っています:

    FIELDAとFIELDB、両方のユニーク - ユニークである必要があり、エンティティの

    コードは次の2つのフィールドがあります

  • fieldA = 'value_a'、fieldB = 'value_b'

私は、フォームからの値(FIELDAは=「value_a」、FIELDB =「value_c」)と別のものを提出しようとする今、Symfony2の一意性をチェックするためのクエリを生成します。

SELECT ... FROM ... WHERE fieldA = ? AND fieldB = ? ('value_a', 'value_c') 

と検証を通過し、理由結果は空のセットですが、フィールドAはこの場合は一意ではないため、失敗すると予想します。 (SQLインサートは「value_a」に関する重複したエントリのエラーで失敗します。)

Symfony2's UniqueEntity documentation saysを:

この必須オプションは、このエンティティは一意である必要がありますどのフィールド(またはフィールドのリスト)です。たとえば、上記のUserの例のemailフィールドとnameフィールドの両方を一意にするように指定できます。

私の期待を裏付けるものだと思います。

in the source of UniqueEntityValidator (line 94)が見つかりました。バリデータは配列としてフィールドを取得し、 "findBy"マジックファインダメソッドを使用して一意性をチェックします。このメソッドは、問題の原因となるクエリ内のパラメータ間にAND関係を使用します。

何らかの理由でこの検証制約を使用することはできますか、それとも別の方法で検証する必要がありますか?

答えて

8

何について:

/** 
* @ORM\Table(name="mytable") 
* @ORM\Entity 
* @DoctrineAssert\UniqueEntity(fields = "fieldA") 
* @DoctrineAssert\UniqueEntity(fields = "fieldB") 
*/ 
class myClass 

+0

ありがとうございました、それが仕事をしていません!唯一の問題は、それぞれのアサートが別のクエリーを取ることですが、私はそれと一緒に暮らすことができると思います。 – csabavegso

+1

それ以外の場合は、UniqueEntity Validatorのインスピレーションを得て、独自のValidatorを書くための解決策が常にあります – webda2l

13

それは次のようになります。

/** 
* @ORM\Table(name="mytable") 
* @ORM\Entity 
* @DoctrineAssert\UniqueEntity(fields = "fieldA") 
* @DoctrineAssert\UniqueEntity(fields = "fieldB") 
*/ 
class myClass 

* @DoctrineAssert\UniqueEntity(fields = {"fieldA", "fieldB"}) 

を行うことで、同じ両方のフィールドを持つ行が存在しない場合、それはチェックします。フォームから別の値を持つ1(FIELDA =「value_a」、FIELDB =「value_c」)を提出しようとすると、今

fieldA = 'value_a', fieldB = 'value_b' 

だからあなたは既に値を持つデータベースのレコードを持っていると仮定しますSymfony2は一意性をチェックするクエリを生成します:

SELECT ... FROM ... WHERE fieldA =?ANDフィールドB =? ( 'value_a'、 'value_c')

とヨーヨーが別の値を有するもの(FIELDA = 'value_a' を提出する場合にのみ、それは

fieldA = 'value_a', fieldB = 'value_b' 

と行と一致しない原因これは、通過する、FIELDB = 'value_b')をフォームから削除すると、検証は成功しません。

これは、それが動作するはず方法であり、それが文書で説明される方法: http://symfony.com/doc/current/reference/constraints/UniqueEntity.html#fields

関連する問題