3

我有几列(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

4 回答 4

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;

}

希望有帮助!

于 2012-06-24T00:00:59.630 回答
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;

}
于 2012-12-12T04:58:33.050 回答
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',
    ),
),
于 2012-06-24T06:17:16.313 回答
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的值。

于 2014-02-03T09:19:04.060 回答