私はフォームから送信されたエンティティの一意性を検証するために、複数のフィールドに対して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、両方のユニーク - ユニークである必要があり、エンティティの
- fieldA = 'value_a'、fieldB = 'value_b'
コードは次の2つのフィールドがあります
私は、フォームからの値(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関係を使用します。
何らかの理由でこの検証制約を使用することはできますか、それとも別の方法で検証する必要がありますか?
ありがとうございました、それが仕事をしていません!唯一の問題は、それぞれのアサートが別のクエリーを取ることですが、私はそれと一緒に暮らすことができると思います。 – csabavegso
それ以外の場合は、UniqueEntity Validatorのインスピレーションを得て、独自のValidatorを書くための解決策が常にあります – webda2l