Constraint UNIQUE

11 views
Skip to first unread message

lsri8088

unread,
Feb 18, 2012, 7:07:57 PM2/18/12
to Yupp Framework PHP
Hola,

Hecho en falta la Constraint UNIQUE... espero que no exista porque en
caso contrario las 3 horas que he pasado para implementarla ... en
fin, me lo he pasado muy bien ;)

Os dejo aqui la implementación, a ver que os parece, pero antes una
pregunta ¿Se puede especificar clave primaria (PRIMARY KEY)? Se que es
el campo ID que se auto inyecta, ¿y si quiero otro campo a parte de
ese?


Implementar constraint UNIQUE:

1) core.validation.Constraints.class.php
Añadir Contraint Unique y función estatica:
....
public static function unique( $unique ) { return new
Unique($unique); }
....
class Unique extends Constraint {

private $unique;

public function __construct( $unique )
{
$this->setValue($unique);
}

public function setValue( $unique )
{
$this->unique = ($unique == NULL)? false : $unique;
}

public function getValue()
{
return $this->unique;
}

public function evaluate( $unique )
{
if ( !$this->unique ) return ($value != NULL);
return true;
}
}

2) core.persisten.PersistentManager.class.php

Añadir key "unique" al array $cols, linea 1445:
foreach ( $attrs as $attr => $type )
{
if ( $attr !== 'id' )
{
$cols[] = array(
'name' => $attr,
'type' => $type,
'nullable' =>
(DatabaseNormalization::isSimpleAssocName( $attr )) ? true : $ins-
>nullable( $attr ),
'unique' => $ins->unique($attr)
);
}
}

3) core.db.DAL.class.php, funcion createTable2
Añadir "UNIQUE" al campo en la sentencia CREATE:


$q_cols .= $col['name'] . " " .
$this->db->getDBType($col['type'],
$constraintsOrNull ) . " " .
((array_key_exists('default', $col)) ? "DEFAULT
" . $col['default'] : '') . // si hay default lo pone
((array_key_exists('nullable', $col) &&
$col['nullable']) ? " NULL" : " NOT NULL") . // Si la clave nullable
esta y si el ooleano en nullable es true, pone NULL.
((array_key_exists('unique', $col) &&
$col['unique']) ? " UNIQUE" : '') .
", ";

Saludos.

pabl...@gmail.com

unread,
Feb 19, 2012, 1:33:21 PM2/19/12
to Yupp Framework PHP
Hola,

On Feb 18, 10:07 pm, lsri8088 <lsri8...@gmail.com> wrote:
> Hola,
>
> Hecho en falta la Constraint UNIQUE... espero que no exista porque en
> caso contrario las 3 horas que he pasado para implementarla ... en
> fin, me lo he pasado muy bien ;)
>

Excelente. voy a revisar el código y te envío cualquier comentario que
surja. (si puedes envíame una aplicación donde una clase del modelo
use esta restricción para poder probarlo más fácilmente). Si todo
funciona ok, lo agrego al código del framework :D

> Os dejo aqui la implementación, a ver que os parece, pero antes una
> pregunta ¿Se puede especificar clave primaria (PRIMARY KEY)? Se que es
> el campo ID que se auto inyecta, ¿y si quiero otro campo a parte de
> ese?

Por ahora no. El ORM de Yupp se basa en que la PK es "id" y se asigna
automáticamente.
En futuras versiones está planeado agregar modificadores para la
generación de las tablas y poder crear índices, funcionalidad que aún
no está soportada.

Lo que se podría hacer es que en el futuro otros campos o conjuntos de
campos sean UNIQUE y ademas tengan un índice, esto sería como una PK
hardcoded :D.

Saludos,
Pablo.

lsri8088

unread,
Feb 19, 2012, 3:38:04 PM2/19/12
to Yupp Framework PHP
En la aplicación videoteca, que adjunte en otro hilo, se pruede probar
esto con el modelo Director.
Si intentas insertar dos registros con el mismo valor para el campo
"name", sale un error 500 de lo mas bonito ... esto es lo que no he
mirado bien... ¿no debería salir un aviso al usuario? ¿donde se haría
esto?

En España ya son las 9:30 de la noche, mañana miraré una aplicación de
ejemplo, pues ahora se empeña en no encontrar el modelo cuando va a
mostrar la lista (acción list) ... -_-

Nos vemos por estas tierras cibernéticas.

Gracias y un saludo.

lsri8088

unread,
Feb 21, 2012, 3:32:28 PM2/21/12
to Yupp Framework PHP
Hola,
Adjunto la aplicacion "testunique".

Tiene una sola tabla con dos campos:
name_Unique (campo marcado como UNIQUE)
laserColor_no_unique

Basta insertar dos registros con el mismo valor para name_Unique y al guardar se produce esta excepción:
La consulta falló: Duplicate entry 'ObiWan' for key 'name_Unique'

Probado con MySQL.

Mirando el código, la excepción se produce en core.db.DatabaseMySQL.class.php, linea 93 (función execute).
Una de dos, o controlamos aquí la excepción devolviendo un código determinado o comprobamos previamente a la llamada execute, si existen registros que no cumplan la condición.

¿Hay hecho algo parecido en el framework?


Saludos.
--
LSRI8088

/* Cualquier tecnología lo suficientemente avanzada es indistinguible de la magia */

testunique.zip

Pablo Pazos

unread,
Feb 26, 2012, 10:38:17 PM2/26/12
to yuppfram...@googlegroups.com
Muy buenas,

De la forma que implementaste la restricción, debe llegar hasta la base de datos para saber si ocurre o no una violación a la restricción.

Como están implementadas ahora las restricciones, ninguna restricción llega hasta la base de datos para verificarse, sino que es parte del código del framework el que hace el trabajo al ejecutar Persistentobject->validate().

Si se quisiera seguir el mismo esquema para unique, se debería implementar usando una consulta extra a la base de datos. Esto tiene sus ventajas y desventajas, lo único es que sigue con la filosofía actual de las restricciones de ejecutarse en código del framework en lugar de delegar al DBMS.

Lo que nunca debería pasar es que la excepción llegue al usuario, sino que se debe catchear dentro del código del framework.

Saludos,
Pablo.

2012/2/21 lsri8088 <lsri...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "Yupp Framework PHP" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a yuppfram...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a yuppframeworkp...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/yuppframeworkphp?hl=es.



--
Atte.
Ing. Pablo Pazos Gutiérrez
LinkedIn: http://uy.linkedin.com/in/pablopazosgutierrez
Blog: http://informatica-medica.blogspot.com/
Sígueme en twitter: http://twitter.com/ppazos

lsri8088

unread,
Mar 4, 2012, 2:07:35 PM3/4/12
to Yupp Framework PHP
Gracias, lo miraré.
Reply all
Reply to author
Forward
0 new messages