2011-12-13 83 views
5

我想通過在多個字段上使用UniqueEntity Validation Constraint來驗證從表單提交的實體的唯一性。Symfony2 UniqueEntity多個字段:誤報驗證?

應該是唯一的實體的代碼有兩個領域 - FIELDAfieldB,既獨特:

/** 
* @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」關係,這會導致問題。

是否有可能以某種方式爲我的問題使用此驗證約束,或者我必須以另一種方式驗證它?

回答

8

什麼:

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

+0

謝謝你,它的工作!唯一的問題是,每個斷言都需要另一個查詢,但我想我可以忍受它。 – csabavegso

+1

否則,你總是有解決方案來寫你自己的驗證器,靈感來自UniqueEntity Validator – webda2l

13

它應該是:

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

這樣做

* @DoctrineAssert\UniqueEntity(fields = {"fieldA", "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 = 'value_a', fieldB = 'value_b' 

匹配行只有當溜溜提交另一個與值(FIELDA = 'value_a',fieldB = 'value_b'),驗證將不會通過。

這是它應該工作的方式以及它是如何在文檔中解釋說: http://symfony.com/doc/current/reference/constraints/UniqueEntity.html#fields