cakephp isUnique для 2 полей?

У меня есть форма регистрации, в которой пользователи могут заполнить два адреса электронной почты (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);
}
7
задан Adexe Rivera 6 June 2014 в 10:34
поделиться

3 ответа

I опубликовал решение этой проблемы в группе Google CakePHP:

http://groups.google.com/group/cake-php/browse_frm/thread/b3a1e4ae3eeb6091/e168f54bac27c163?lnk=gst&q=checkUnique#e168f54bac27c163

Добавить следующее к вашей модели приложения:

        /** 
         * 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" 
                        ) 
                ) 
       ); 
13
ответ дан 6 December 2019 в 07:25
поделиться

Насколько я помню, для такого рода принуждения нужно использовать метод beforeSave в модели. У меня было требование, чтобы у объекта был установлен хотя бы один из N fks, и я мог сделать это только таким образом.

Edit: попробуйте этот поток, чтобы посмотреть, решит ли что-нибудь там вашу проблему.

-2
ответ дан 6 December 2019 в 07:25
поделиться

Да и нет.

Да, вам придется кодировать его самостоятельно, но в рамках компонента проверки CakePHP.

Компонент проверки имеет механизм, разрешающих пользовательские правила проверки. По сути, вы помещаете имя функции внутри $validate (как обычно). Вы должны определить функцию; в этом случае это довольно просто (просто примените требование double isUnique).

http://book.cakephp.org/2.0/en/models/data-validation.html#custom-validation-правила

-1
ответ дан 6 December 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: