viernes, 6 de junio de 2008

Error al devolver, eliminar o actualizar con Propel

Problema
La forma normal y la mas usada para devolver, eliminar o actualizar un registro usando PROPEL

Devolver un registro:
<?php
$product = ProductosPeer::retrieveByPK($id);
print $product->getNombre();
?>
Eliminar un registro:
<?php
$product = ProductosPeer::retrieveByPK($id);
$product->delete();
?>
Actualizar un registro:
<?php
$product = ProductosPeer::retrieveByPK($id);
$product->setNombre('TESTING');
$product->save();
?>
Funcionan siempre en la mayoria de casos, pero existe un error que se produce cuando se define en la base de datos un campo de fecha que acepte valores '0000-00-00' o que contenga este valor.

Para especificar como se produce este error veremos la primera linea de codigo donde obtenemos todo el registro segun su ID
<?php
$product = ProductosPeer::retrieveByPK($id);
?>
Es justo en este momento donde se produce un error, ya que lo que quiere es asignar al objeto todos los campos del registro obtenido. Esto no seria ningun problema si es que se uno de los campos del registro es del tipo date (fecha) y tiene asignado el valor '0000-00-00' . Esto produce un error y detiene la operacion.

Uno similar a este:

Fatal error: Uncaught exception 'PropelException' with message 'Error populating Productos object [wrapped: Unable to convert value at column 6 to timestamp: 0000-00-00 00:00:00]' in /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductos.php:383 Stack trace: #0 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductosPeer.php(317): BaseProductos->hydrate(Object(MySQLResultSet)) #1 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductosPeer.php(265): BaseProductosPeer::populateObjects(Object(MySQLResultSet)) #2 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductosPeer.php(548): BaseProductosPeer::doSelect(Object(Criteria), Object(MySQLConnection)) #3 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/Productos.php(100): BaseProductosPeer::retrieveByPK('73') #4 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/index.php(165): Productos->editVisita('73') #5 {main} in /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductos.php on line 383

Solucion
Encontre una pequeña solucion para evitar (no arreglar) este problema. Para ello, no asigno todos los campos del registro obtenido desde la base de dato. Si no, utilizo el objeto CRITERIA que me servira para listarlo en un objeto de tipo mas generico del tipo RECORD

Devolver un registro:
<?php
// Genero una consulta para ver si existe el producto con ID especificado
$c = new Criteria();
$c->addSelectColumn(ProductosPeer::NOMBRE);
$c->add(ProductosPeer::ID_PRODUCTO,$id, Criteria::EQUAL);
$rs = ProductosPeer::doSelectRS($c);

// Verifica si existe algun registro y si es asi solo devolvera un registro
if($rs->next()){
print $rs->getString(1)
}
Eliminar un registro:
<?php
// Genero una consulta para ver si existe el producto con ID especificado
$c = new Criteria();
$c->add(ProductosPeer::ID_PRODUCTO,$id, Criteria::EQUAL);

// Llama al metodo eliminar para que elimine el registro devuelto por la consulta
ProductosPeer::doDelete($c);
?>
Actualizar un registro:
<?php
// Variable de conexion del propel
$conn = Propel::getConnection('proyecto');

// Criteria para elegir el registro que se desea modificar
$c1 = new Criteria();
$c1->add(ProductosPeer::ID_PRODUCTO,$id, Criteria::EQUAL);

// Criteria para actualizar el campo del registro
$c2 = new Criteria();
$c2->add(ProductosPeer::NOMBRE,$data['productName']);

// Llamar al metodo para actualizar
BasePeer::doUpdate($c1, $c2, $conn);
?>

No hay comentarios: