我想通過在多個字段上使用UniqueEntity Validation Constraint來驗證從表單提交的實體的唯一性。Symfony2 UniqueEntity多個字段:誤報驗證?
應該是唯一的實體的代碼有兩個領域 - FIELDA和fieldB,既獨特:
/**
* @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 ='value_a',fieldB ='value_b'
現在,當我試圖從一個表單提交另一個與值(FIELDA =「value_a」,fieldB =「value_c」),Symfony2中生成一個查詢,以檢查的獨特性:
SELECT ... FROM ... WHERE fieldA = ? AND fieldB = ? ('value_a', 'value_c')
和驗證通過,因爲結果是一個空集,但我預計它會失敗,因爲fieldA在這種情況下不會是唯一的。 (SQL插入失敗,在「value_a」的重複條目的錯誤。)
Symfony2's UniqueEntity documentation says:
這個必需的選項字段(或字段列表)在此實體應該是唯一的。例如,您可以指定上面用戶示例中的電子郵件和名稱字段應該是唯一的。
我認爲這證實了我的期望。
我找到了in the source of UniqueEntityValidator (line 94),驗證器將這些字段作爲數組使用,並使用「findBy」魔法查找方法來檢查唯一性。該方法在查詢中使用參數之間的「AND」關係,這會導致問題。
是否有可能以某種方式爲我的問題使用此驗證約束,或者我必須以另一種方式驗證它?
謝謝你,它的工作!唯一的問題是,每個斷言都需要另一個查詢,但我想我可以忍受它。 – csabavegso
否則,你總是有解決方案來寫你自己的驗證器,靈感來自UniqueEntity Validator – webda2l