martes, 22 de marzo de 2011

Para validar indices únicos de 2 campos

Generalmente es fácil hacer la comprobación si un valor que se va a insertar en una columna es único, es decir no será un valor repetido en esa columna.

Pero cuando el indice único esta compuesto por 2 campos digamos nombre y apellido y no quiero que se repita esa combinación, CakePHP, no cuenta son una regla isUnique explicita para estos indices compuestos.

¿La solución?

Crear una función de validación  propia que haga esto por nosotros.
Cómo no soy un experto en CakePHP y menos en PHP, depues de dar tratar de construirla yo mismo por un par de horas, decidi buscar alguna solución ya probada pues segurament eno soy el unico con ese problema. He aqui la solución:

Agregar la siguiente función el el modelo que contiene la combinación de campos a validar.


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]) && $this->data[$this->name][$this->primaryKey] > 0) {
            $tmp[$this->primaryKey." !="] = $this->data[$this->name][$this->primaryKey];
        }
    //return false;
        return $this->isUnique($tmp, false); 
    }

LUego en el mismo modelo en la variable $validate, llamar esta función de validación par AMBOS campos:


'field1' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),
'field2' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),


Y hago énfasis en AMBOS capos pues en algún blog indicaban lo mismo pero omitían el segundo campo y así parece no funcionar, al menos para mi.

Fuente original:
http://stackoverflow.com/questions/3445483/validation-rule-for-a-composite-unique-index-non-primary

1 comentario: