Pregunta

Tengo un formulario de registro en el que los usuarios pueden rellenar en dos direcciones de correo electrónico (email1 y email2). el requisito de marketing es que tienen que ser único (singular como en si tuviéramos 10 usuarios, entonces no habría 10 * 2 = 20 dirección de correo electrónico única).

El sistema ya está construido sobre cakephp, así que lo que me gustaría saber es, ¿hay algo similar a la función isUnique (único en un campo) que pueden hacer esto bien fuera de la caja? O estoy condenado a codificar esto mismo? Gracias de antemano.

EDIT: construida en el ejemplo de Richard, esto funcionó para mí:

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

Solución

He publicado una solución a este CakePHP en el grupo de Google:

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

Añadir lo siguiente a su 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); 
        } 
} 

y se utiliza en el modelo de validación:

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

Otros consejos

checkUnique solo podía ser escrito como una envoltura para isUnique.

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

y se utiliza en el modelo de validación:

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

De CakePHP 2.0 documentación:

Puede validar que un conjunto de campos son únicos proporcionando múltiples campos y establecer o $ false:

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

Asegúrese de incluir el campo original en la lista de campos al hacer una regla única a través de múltiples campos.

Si un campo de la lista no se incluye en los datos del modelo, a continuación, se trata como un valor nulo. Usted puede considerar que marca los campos enumerados según sea necesario.

Sí y no.

Sí, usted tendrá que codificar por sí mismo, pero dentro del componente de validación de CakePHP.

El componente de validación tiene un mecanismo para permitir que las reglas de validación personalizado. En esencia, se pone un nombre de función en el interior de validación $ (como lo haría normalmente). Usted tiene que definir la función; en este caso, es bastante simple (solo hacer cumplir su requisito de la doble isUnique).

http: //book.cakephp .org / 2.0 / es / modelos / datos personalizados validation.html #-validación-reglas

A riesgo de ser golpeado en la cabeza y los hombros por ofrecer un no CakePHP solución, que me presento a continuación.

Crear un índice único en su base de datos sobre sin embargo muchas columnas que necesita.

sintaxis SQL estándar para esto es:

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

Añade "$ this-> Modelo-> save ()" comando dentro de un bloque "try / catch". En el bloque de "atrapar", probar la excepción del código de error. En MySQL, una violación única clave es el código de error 23000, pero usted debe estar preparado para otros posibles errores también.

Es rápido y sencillo y no implica contar paréntesis matriz.

debe siempre base de datos de código de acceso a cabo dentro de un "intento de captura /" bloque de todos modos. Parte de su manejo de excepciones debe incluir registro de los mensajes de error inesperados. No se puede esperar CakePHP para hacer todo para usted.

Por lo que yo recuerdo, usted tiene que este tipo de cumplimiento utilizando el método beforeSave en el modelo. Yo tenía un requisito de que un objeto tiene al menos uno de FKS conjunto N, y sólo podía hacerlo de esta manera.

Editar: prueba a este hilo para ver si hay algo allí resuelve su problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top