Pergunta

Eu tenho um formulário de registro no qual os usuários podem preencher dois endereço de e -mail (email1 e email2). A exigência do marketing é que eles precisem ser únicos (exclusivos, como se tivéssemos 10 usuários, haveria 10*2 = 20 endereço de email exclusivo).

O sistema já está construído no CakePhp, então o que eu gostaria de saber é que existe algo semelhante ao recurso Isunique (único em um campo) que pode fazer isso imediatamente? Ou estou fadado a codificar isso sozinho? Desde já, obrigado.

EDIT: Construído no exemplo de Richard, isso funcionou para mim:

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);
}
Foi útil?

Solução

Eu postei uma solução para isso no grupo CakePhp Google:

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

Adicione o seguinte ao seu AppModel:

        /** 
         * 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); 
        } 
} 

e é usado em seu modelo Validate:

        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" 
                        ) 
                ) 
       ); 

Outras dicas

checkUnique poderia ser escrito como um invólucro para isUnique.

class AppModel extends Model {
    public function checkUnique($ignoredData, $fields, $or = true) {
        return $this->isUnique($fields, $or);
    }
}

e é usado em seu modelo Validate:

public $validate = array(
    'name' => array(
        'unique' => array(
            'rule' => array('checkUnique', array('name', 'institution_id'), false), 
            'message' => 'A contact with that name already exists for that 
institution'
        )
    )
);

Documentação do CakePhp 2.0:

Você pode validar que um conjunto de campos é único, fornecendo vários campos e definido $ ou para false:

public $validate = array(
    'email' => array(
        'rule' => array('isUnique', array('email', 'username'), false),
        'message' => 'This username & email combination has already been used.'
    )
);

Certifique -se de incluir o campo original na lista de campos ao criar uma regra única em vários campos.

Se um campo listado não estiver incluído nos dados do modelo, ele será tratado como um valor nulo. Você pode considerar marcar os campos listados conforme necessário.

Sim e não.

Sim, você terá que codificar você mesmo, mas dentro do componente de validação do CakePHP.

O componente de validação possui um mecanismo para permitir regras de validação personalizadas. Essencialmente, você coloca um nome de função dentro do $ Validate (como normalmente faria). Você precisa definir a função; Nesse caso, é bem simples (apenas aplique seu requisito duplo de isunique).

http://book.cakephp.org/2.0/en/models/data-validation.html#custom-validation-rules

Correndo o risco de ser espancado sobre a cabeça e os ombros por oferecer um não-cakephp Solução, deixe -me apresentar o seguinte.

Crie um índice exclusivo em seu banco de dados sobre o número de colunas que você precisa.

Sintaxe SQL padrão para isso é:

create unique index {IndexName} on {Table} ({Column}, {Column}, ...)

Coloque seu comando "$ this-> modelo-> salv ()" dentro de um bloco "try/captil". No bloco "Catch", teste a exceção para o código de erro. No MySQL, uma violação chave única é o código de erro 23000, mas você deve estar preparado para outros possíveis erros.

É rápido e simples e não envolve contando parênteses da matriz.

Você deve sempre Coloque o código de acesso ao banco de dados dentro de um bloco "Try/Catch" de qualquer maneira. Parte do seu manuseio de exceção deve incluir registrar as mensagens de erro inesperadas. Você não pode esperar que o CakePhp faça tudo para voce.

Tanto quanto me lembro, você tem esse tipo de aplicação usando o beforeSave Método no modelo. Eu tinha a exigência de que um objeto tenha pelo menos um dos n fks e eu só podia fazer dessa maneira.

Editar: tente este tópico Para ver se alguma coisa aí resolve seu problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top