我有几个列(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上的阅读和那些讨论类似问题的人似乎认为这个解决方案可行,但不幸的是不适合我。
提前致谢!
答案 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的值。