У меня есть форма регистрации, в которой пользователи могут заполнить два адреса электронной почты (email1 и email2). Требование маркетинга - то, что они должны быть уникальными (уникальный как в том, если бы у нас было 10 пользователей, то затем было бы 10*2=20 уникальный адрес электронной почты).
Система уже основана на cakephp, поэтому что я хотел бы знать, там что-то подобное isUnique функции (уникальный в одном поле), который может сделать это правильно из поля? Или я обречен кодировать это сам?Заранее спасибо.
Править: основанный на примере Richard, это работало на меня:
function checkUnique($data, $fields) {
if (!is_array($fields)) {
$fields = array($fields);
}
foreach($data as $key) {
$checks = $key;
}
if (empty($checks)) {
return true; //allow null
}
foreach($fields as $key) {
$tmp[$key] = $checks;
}
if (isset($this->data[$this->name][$this->primaryKey])) {
$tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this->primaryKey];
}
return $this->isUnique($tmp);
}
I опубликовал решение этой проблемы в группе Google CakePHP:
Добавить следующее к вашей модели приложения:
/**
* checks is the field value is unqiue in the table
* note: we are overriding the default cakephp isUnique test as the
original appears to be broken
*
* @param string $data Unused ($this->data is used instead)
* @param mnixed $fields field name (or array of field names) to
validate
* @return boolean true if combination of fields is unique
*/
function checkUnique($data, $fields) {
if (!is_array($fields)) {
$fields = array($fields);
}
foreach($fields as $key) {
$tmp[$key] = $this->data[$this->name][$key];
}
if (isset($this->data[$this->name][$this->primaryKey])) {
$tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this-
>primaryKey];
}
return $this->isUnique($tmp, false);
}
}
и используется в вашей модели проверки:
var $validate = array(
"name"=>array(
"unique"=>array(
"rule"=>array("checkUnique", array("name", "institution_id")),
"message"=>"A contact with that name already exists for that
institution"
)
)
);
Насколько я помню, для такого рода принуждения нужно использовать метод beforeSave
в модели. У меня было требование, чтобы у объекта был установлен хотя бы один из N fks, и я мог сделать это только таким образом.
Edit: попробуйте этот поток, чтобы посмотреть, решит ли что-нибудь там вашу проблему.
Да и нет.
Да, вам придется кодировать его самостоятельно, но в рамках компонента проверки CakePHP.
Компонент проверки имеет механизм, разрешающих пользовательские правила проверки. По сути, вы помещаете имя функции внутри $validate (как обычно). Вы должны определить функцию; в этом случае это довольно просто (просто примените требование double isUnique).
http://book.cakephp.org/2.0/en/models/data-validation.html#custom-validation-правила