martes, 19 de julio de 2011

Obtener resultado con un solo valor en Doctrine 1.2

Si se construye una consulta que nos entrega un valor y no queremos o no se obtiene un objeto como tal, habrá que cambiar el hidratador de la consulta, ya que por defecto Doctrine creará un objeto de la clase correspondiente a la clase principal en la consulta.

Por ejemplo, si queremos obtener la sumatoria de una columna numérica, no sólo no necesitamos el objeto, sino que la consulta no generará información para crear uno. La consulta y el getter podrían quedar así:


public function queryValorTotal()
{
   $q = Doctrine_Query::create()
     ->select('SUM(c.valor) AS sum_valor')
     ->from('NombreClase c');

   return $q;
}

public function getValorTotal()
{
   return $this->queryValorTotal()->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
}

En otros casos, aunque la consulta pueda entregar un objeto no necesitamos toda su información sino algunos campos. Entonces podríamos cambiar el hidratador para obtener un array, lo que acelerará la ejecución de la consulta:

$q = $this->queryReporte();
$items = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);

Para más información sobre los hidratadores ver la documentación de Doctrine 1.2 "Doctrine ORM for PHP" capítulo 14.