CakePHP 2.1 - 自定义验证规则 - 检查唯一字段值组合

时间:2012-06-23 23:30:45

标签: validation cakephp unique cakephp-2.0 customvalidator

我有几个列(ip,provider_id),我希望值的组合始终是唯一的。因此,我正在尝试构建自定义验证功能。但我有问题抓住二级领域的价值。这是我目前在模型中的代码:

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;

}

所以问题是当我测试加载到$ field中的值时,它只是'provider_id',一个字符串。我希望它包含'provider_id'字段的值。有没有人知道如何获取该值(以及必要时的所有其他辅助模型字段值)并将其发送到自定义验证函数?

我在CookBook上的阅读和那些讨论类似问题的人似乎认为这个解决方案可行,但不幸的是不适合我。

提前致谢!

4 个答案:

答案 0 :(得分:5)

蛋糕肯定会按照应有的方式表现。您在“规则”数组中传递的第二个参数计将作为静态值传递。

但是,您的provider_id应该在$ this-> data ['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;

}

希望有所帮助!

答案 1 :(得分:2)

为了补充Joshua的答案,验证数组应该像这样构建:

// 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;

}

答案 2 :(得分: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',
    ),
),

答案 3 :(得分: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的值。