2015-09-20 34 views
1

我有一個需要兩個字段中的一個非空的模型。任何一個都可以是空的,只要另一個不是。我被困在最好的方式來做到這一點。CakePHP 3:如何使用驗證強制兩個字段中的任意一個不爲空

我可以防止條目是這樣的:

$validator 
     ->notEmpty('my_field', 'a or b must be non-empty', [$this, 'checkIfAorBisEmpty']);    

第三個參數是有條件的功能,對於規則返回true只有在其他領域也爲空予以強制執行。但是,這只是阻止這樣的事情:

$this->Table->newEntity(['a'=>'', 'b'=>'', 'c'='foobar']);` 

我想也防範這樣的事情:

$this->Table->newEntity(['c'=>'foobar']);` 

上面的代碼將防止這一點,因爲如果密鑰完全省略保存的數據,然後他們沒有效果。我不能使用requirePresence,因爲根據文檔,不像notEmpty,它不支持條件函數。

顯然,應用程序buidRules()不限於相同的方式,但它們不在newEntity()上運行。

這樣做的正確方法是什麼?

回答

0

我想出了我的問題......我誤解了newEntity()save()的工作方式。我認爲newEntity正在更新數據庫,但我錯了。它運行驗證並返回一個實體對象。然後,實體對象需要被保存......並且這是構建規則適用的時候。

所以我的問題的解決方案實際上是構建規則。我只是不知道它。雖然我的問題被誤導了,但我會留在這裏以防其他人遇到同樣的問題。雙層驗證系統是CakePHP v2到v3的變化之一。

相關問題