2012-06-23 44 views
3

我有一對夫婦,我想值的組合總是唯一的列(IP,PROVIDER_ID)的。因此,我正在嘗試構建自定義驗證函數。但是我在爭奪次要領域的價值方面遇到了問題。這是在模型到目前爲止我的代碼:CakePHP的2.1 - 自定義驗證規則 - 檢查唯一字段值組合

public $validate = array(
    'ip' => array(
     'rule' => array('uniqueClick', 'provider_id'), 
     'message' => 'The click is not unique.' 
    ) 
); 

public function uniqueClick ($ip, $field) { 

    $count = $this->find('count', array('conditions' => array('ip' => $ip, 'provider_id' => $field))); 
    // echo $field; 
    return $count == 0; 

} 

所以問題是,當我測試什麼價值被加載到$領域,它只是「PROVIDER_ID」,一個字符串。我希望它會包含'provider_id'字段的值。有誰知道如何獲取該值(以及所有其他輔助模型字段值,如有必要)並將其發送到自定義驗證功能?

我的食譜,人們的閱讀誰討論過類似的問題似乎暗示該解決方案將工作,但不適合我很遺憾。

在此先感謝!

回答

5

蛋糕肯定是表現它應該存在的方式。您在「規則」數組中傳遞的第二個參數將作爲靜態值傳遞。

然而,你應該PROVIDER_ID在$這個 - 可>數據[ '爲MyModel'] [ 'PROVIDER_ID']

所以,你應該能夠找到的關於第二個參數完全忘記,然後執行:

public function uniqueClick ($ip) { 

    $count = $this->find('count', array(
     'conditions' => array(
      'ip' => $ip, 
      'provider_id' => $this->data[$this->alias]['provider_id']) 
    )); 
    return $count == 0; 

} 

希望幫助!

+0

非常感謝!非常感激! – alieninlondon

0

你也可以用我的規則與能夠用,因爲你需要

嘗試http://www.dereuromark.de/2011/10/07/maximum-power-for-your-validation-rules/https://github.com/dereuromark/tools/blob/master/Model/MyModel.php#L930

所以基本上比你試過同許多領域的工作:

'ip' => array(
    'validateUnique' => array(
     'rule' => array('validateUnique', array('provider_id')), 
     'message' => 'You already have an entry', 
    ), 
), 
+0

謝謝,但這個如何工作?鑑於數組('user_id')作爲每個joshua.paling答案的靜態值傳遞,我如何傳遞像user_id字段這樣的字段?另外我對上面的語法有點不熟悉,爲什麼要添加'validate'=>數組(-line?)並且這些東西放在兩者之間:public $ validate = array(**這裏是你的東西**);? – alieninlondon

+0

你可以很容易地在你的數據數組中傳遞提供者id:'$ this-> data ['ModelName'] ['provider_id']'應該包含這個值,並且比它在盒子裏的所有功能都好。 – mark

2

爲了補充約書亞的答案,驗證陣列應該建立這樣的:

// Validation rules 
public $validate = array(
    'ip' => array(
     'rule' => array('uniqueClick', 'ip'), 
     'message' => 'The click is not unique.' 
    ) 
); 
/** 
* Checks if there are records on the datasource with the same ip and same provider_id 
* 
*/ 
public function uniqueClick ($ip) { 
    $count = $this->find('count', array(
     'conditions' => array(
      'ip' => $ip, 
      'provider_id' => $this->data[$this->alias]['provider_id']) 
    )); 
    return $count == 0; 

} 
0

您可以用此溶液直接不經過驗證規則任何東西,除了自定義的獨特作用。

// Validation rules 
public $validate = array(
    'ip' => array(
     'rule' => array('uniqueClick'), 
     'message' => 'The click is not unique.' 
    ) 
); 
/** 
* Checks if there are records on the datasource with the same ip and same provider_id 
* 
*/ 
public function uniqueClick ($ip) { 
    $count = $this->find('count', array(
     'conditions' => array(
      'ip' => $ip, 
      'provider_id' => $this->data[$this->alias]['provider_id']) 
    )); 
    return $count == 0; 

} 

$ this-> data [$ this-> alias] ['provider_id']自動獲取provider_id的值。