Validar datos duplicados en CakePHP

Reading time ~3 minutes

Hoy mismo he necesitado de una validación para verificar si un dato ya existe en la base de datos. Dado que CakePHP 1.1 (en versiones posteriores a la 1.2 podéis utilizar “isUnique”) no lleva una validación en su núcleo para estos menesteres he tenido que crearla y ahora la comparto con vosotros:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * Verifica si un campo existe en la base de datos
 * Si estamos editando se excluye el valor guardado en la validación
 * @param array $data
 * @param string $field Nom de la cel·la a verificar
 * @return
 */

public function checkUnique($data)
{
  $field = array_pop(array_keys($data));
  $data = array_pop(array_values($data));

  // Si estem editant...
  if (isset($this->data[$this->name]['id'])) {
    if ($field == $this->field($field, array($this->name . '.id' => $this->data[$this->name]['id']))) {
      return true;
    }
  }
  // Si no estem editant...
  if ($this->hasField($field)) {
    return $this->isUnique(array($field => $data));
  }
}

Para utilizarlo no tenéis más que añadir el trozo de código en el modelo deseado (normalmente en AppModel, para poder utilizarlo desde cualquier modelo) y añadir la validación en el modelo que queráis:

1
2
3
4
5
6
var $validate = array(
  'NOMBRE DE LA CELDA A VALIDAR' => array(
    'rule'    => 'checkUnique',
    'message' => 'Blahblahblah'
  )
);

Un ejemplo muy común:

1
2
3
4
5
6
var $validate = array(
  'username' => array(
    'rule'    => 'checkUnique',
    'message' => 'Ya existe un usuario registrado con este nombre!'
  )
);

Que lo disfrutéis :)

Edición: Se me olvidó comentar que, a diferencia del método de validación checkUnique que se utiliza en el post Inegrando CakePHP y PhpBB 3.x, este método sirve también a la hora de editar un ítem ya que, en ese caso, retorna true si el valor de la celda coincide con el ya guardado en la base de datos.