miércoles, 4 de julio de 2007

Comprobar que algo es único

Tenía la impresión de haber escrito algo sobre esto, pero parece que no. Así que pego este pequeño método que comprueba si un modelo es único. En este caso, un usuario comprobando si su nombre es único.

La clase Model tiene un método isUnique () al que le podemos pasar varias condiciones, en formato de pares "campo" => "condición" (como los métodos Find) y un segundo parámetro para booleano para responder en cuanto una condición se cumpla. Si le pasas true, isUnique devuelve true con tal de que se cumple alguna de las condiciones. Si le pasas false, tienen que cumplirse todas las condiciones.

Un pequeño falloUna pequeña limitación de esta función es que no está pendiente automáticamente del id del modelo. Esto genera el problema de que cuando editas un modelo, la validación falla porque efectivamente existe un registro igual en la base de datos: justamente el que estás editando. Incluyendo el chequeo del id como condición en caso de que estemos editando un registro, funcionará correctamente. Para saber si un modelo está en "edición" no tenemos más que mirar si hay valor en model::id.

Cuando estamos añadiendo un modelo (todavía no está guardado en la base de datos) el problema no se presenta y valida correctamente.

Pienso que el código se explica bastante bien:

function usuarioEsUnico ($nombreUsuario) {
// Empezamos suponiendo que el nombre no va a validar
$esValido = false;
// La condición básica es que no coincidan los nombres de usuario
$condiciones['usuario'] = $nombreUsuario;
// Si estamos editando (hay valor en model::id, entonces comprobamos que no sea el mismo id
if ($this->id) {
$condiciones['id'] = '<> '.$this->id;
}
// Y ahora preguntamos al modelo si es único
$esValido = $this->isUnique ($condiciones, false);
return $esValido;
}

3 comentarios:

Fernando dijo...

Hola!!!Tengo la siguiente duda: Como hago para indicar en el "modelo" que la clave primaria es compuesta, es decir, esta constituida por mas de un atributo. Ejemplo: codigo_empresa y nro_sucursal...el nro_sucursal es correlativo dentro de la empresa...con lo cual ambos campos forman la clave primaria. Como expreso esto en la propiedad $primaryKey???...Se pueden definir claves primarias compuestas en Cake??.
Saludos a todos!!!

Frankie dijo...

Esto se ha discutido varias veces en los grupos cakePHP de Google. Por ejemplo:

http://groups.google.com/group/cake-php/browse_thread/thread/23229ec81b25d6f7/949defedf3bc4324?lnk=gst&q=compound+keys&rnum=1#949defedf3bc4324

Y la respuesta básicamente es que CakePHP no maneja claves compuestas.

Personalmente siempre he tenido problemas tanto con claves compuestas como con claves "externas". Siempre uso id abstractos.

Fernando dijo...

Gracias Frankie!!! Espero que en sucesivas versiones de Cake logren solucionar este tipo de problemas con las claves compuestas.