Blog


Mejora el rendimiento de Doctrine2 en tus aplicaciones Symfony2

MEJORA EL RENDIMIENTO DE DOCTRINE2 EN TUS APLICACIONES SYMFONY2

19 / 03 / 2015 Symfony

En este artículo vamos a ver una forma de mejorar el rendimiento de nuestras aplicaciones Symfony cuando trabajamos con Doctrine. Vamos a conocer cómo funciona Doctrine y proponer un método para mejorar su rendimiento.

Digamos que tenemos dos entidades, Cliente y Factura, con 3 clientes almacenados en base de datos y una serie de facturas y queremos mostrar el listado de todas las facturas con el nombre y apellido de sus correspondientes clientes.

Recuperar todas las facturas sería tan sencillo como realizar la siguiente petición desde nuestro controlador:


$facturas = $this->getDoctrine()->getRepository('AppBundle:Factura')->findAll();

Y para mostrarlas en nuestra plantilla, algo como lo siguiente:


{% for factura in facturas %}
    <article>
        <h2>{{ factura.concepto }}</h2>
        <p>Cliente: {{ factura.cliente.nombre }} {{ factura.cliente.apellido }}</p>
    </article>
{% endfor %}

Si después de ejecutar este código echamos un vistazo a la barra de depuración web de Symfony2 veremos que se han ejecutado 4 consultas.

Barra de depuración web de Symfony2

¿Cómo puede ser si nosotros sólo lanzamos una petición? Esto es así porque Doctrine por defecto no carga las entidades relacionadas, en nuestro caso Cliente, por lo que se tienen que realizar 3 peticiones más para recuperar los clientes asociados a las distintas facturas.

Vamos a ver cómo podemos optimizar esta consulta. Únicamente necesitamos usar JOIN con las entidades relacionadas requeridas en nuestro caso. Para ello, podemos incluir un nuevo método en el repositorio Factura:


// src/AppBundle/Entity/FacturaRepository.php

public function findAllFacturas()
{
    $query = $this->createQueryBuilder('f')
        ->addSelect('c')
        ->innerJoin('f.cliente', 'c');
 
    return $qb->getQuery()->getResult();
}

Y modificamos la consulta en nuestro controlador:


$facturas = $this->getDoctrine()->getRepository('AppBundle:Factura')->findAllFacturas();

Si ahora volvemos a ejecutar nuestro código y comprobamos de nuevo la barra de depuración web de Symfony2, veremos que solo se ha realizado una petición y además se ha reducido el tiempo de ejecución.

Barra de depuración web de Symfony2



ARTÍCULOS RELACIONADOS