2017-03-29 122 views
1

情境:我有一個基於實體的表單。這個實體有兩個屬性國家staticRank和這兩個兩個屬性的元組應該是唯一的...... 但是:staticRank可能是不需要的,原因在於,它可以爲null。我嘗試使用UniqueEntity註釋解決這個問題:Symfony表單驗證:UniqueEntity - 多個字段 - 包括一個可爲空的字段

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

這不是工作像預期的,因爲如果staticRank應當按照我的定義的有效組合。然而,有幾個元組給予相同的國家(對於staticRank),所以約束記錄違反。

實際問題:有沒有一種方法來實現這種行爲而不繼承「UniqueEntityValidator」?

編輯:據我所經歷的,約束的ignoreNull - 屬性將只允許兩個值是零(或者如果約束僅設置爲單場)

+0

國家和staticRank實體是多對多關係還是實體的字段? – Mawcel

+0

@Mawcel國家是一個ManyToOne,staticRank只是一個領域(都在同一個實體中使用) – thellmei

+0

http://stackoverflow.com/questions/25810738/unique-values-for-two-columns-in-doctrine – Mawcel

回答

1

解決了問題通過傳遞服務爲我喜歡的類型(從「AbstractType」繼承),並增加了約束選項:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setRequired('myService'); 
    $resolver->setDefaults([ 
     // ... 
     'constraints' => [ 
      new Callback([ 
       'callback' => [$this, 'checkCountryRankUniqueness'] 
      ]) 
     ] 
    ]); 
} 

在這種約束的方法,我查了staticRank是否爲空。如果它不爲空,它將迭代所有對象並檢查組合是否唯一。