Symfony propel: usar funciones en el objeto Criteria

Criteria es el objeto que permite definir los criterios de selección de resultados en sistemas que emplean Propel como ORM. Propel y Doctrine son dos plataformas de mapeo de resultados SQL a clases empleados por Symfony. Este post se centra en el uso de Propel y describo como emplear funciones SQL propias en el objeto Criteria.

Imagina que tenemos una tabla llamada producto con dos campos:

  • id
  • nombre

En el modelo de clases generado por Symfony tendremos una clase llamada ProductoPeer que es la encargada de realizar los accesos a base de datos. Para realizar las consultas hemos de construir un objeto Criteria que contiene las características de los datos que deseamos seleccionar. En algunas ocasiones es útil emplear funciones que hemos escrito en base de datos, como por ejemplo, una función que dado un id de producto nos devuelve el número de veces que se ha consultado en nuestra web. El código lógico sería el siguiente:

$criteria = new Criteria();

$criteria->addAsColumn(‘consultas’, ‘getConsultasProducto(‘.ProductoPeer::ID.’)');
$criteria->add(ProductoPeer::ID, $productoId);
ProductoPeer::doSelect($criteria);

getConsultasProducto es una función de base de datos que devuelve el número de consultas.

Si lanzamos la aplicación dará un error indicando que ProductoPeer no puede encontrar el campo con la clave primaria. Para evitar esto usamos lo siguiente:

$criteria = new Criteria();
$criteria->clearSelectColumns();
$criteria->addSelectColumn(self::ID);
$criteria->addSelectColumn(self::NOMBRE);
$criteria->addAsColumn('consultas', 'getConsultasProducto('.ProductoPeer::ID.')');
$criteria->add(ProductoPeer::ID, $productoId);
ProductoPeer::doSelect($criteria);

Lo nuevo con respecto al código inicial es que se resetean los campos que estarán en la select y se añaden en el mismo orden en el que están declarados en config/schema.yml del proyecto. Gracias a esto, podemos ordenar los resultados por el número de consultas del producto:

$criteria->addDescendingOrderByColumn($criteria->getColumnForAs('consultas'));

Espero que sea de utilidad. Saludos.

Advertisement

Acerca de Víctor

Programador, deportista y bloguero.

Publicado el 26 noviembre, 2011 en PHP, symfony y etiquetado en , , , , , , , . Guarda el enlace permanente. Dejar un comentario.

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.