Problema con consulta para un listado.

Hola,

Estoy desarrollando un sitio de donaciones con symfony y necesito mostrar un listado de los recolectores con el monto total y # total de donaciones de forma descendente.

Las 3 tablas que principales son

  • collector: Información de los recolectores
  • donation: Información de la donación
  • transaction: Información de la transaccion

En un principio se pensó que una transaccion podría aplicar a mas de un recolector y por eso genere la tabla intermedia donation.

Para obtener el listado hice la consulta con sql directo y quedo así:

SELECT c.id, cp.name, d.total_amount, d.total_donations
FROM collector c
    INNER JOIN collector_profile cp ON cp.collector_id = c.id
    LEFT JOIN (
        SELECT sd.collector_id, SUM(sd.amount) total_amount, COUNT(sd.amount) total_donations
        FROM donation sd
            INNER JOIN TRANSACTION st ON st.id = sd.transaction_id
        WHERE st.status = 1
        GROUP BY sd.collector_id
    ) d ON d.collector_id = c.id
ORDER BY total_amount DESC, cp.name ASC;

El problema es que doctrine no soporta subconsultas en los join (hasta donde se y pude investigar). Como ahorita lo solucione fue crear dos campos calculados en la tabla collector uno para el monto total y otro para el total de donaciones entonces con listener cada que una transaccion se registra como correcta actualizo estos campos.

No creo que esto sea lo mejor pero por ahora me funciona. ¿A alguien se le ocurre una mejor solución?

Saludos.

Respuestas

#1

Hola @iBet7o,

Si lo que quieres realizar solamente una consulta de la información, lo que yo haría sería crear una vista directamente en la base de datos y hacer una entidad para que la administrara doctrine, de ahi en adelante es una consulta sencilla.

Saludos.

#2

Hola @miguelplazasr,

Lo pensé pero existe una pagina de perfil para cada collector donde se muestra su posición en el ranking. Lo que termine haciendo fue crear 3 funciones

  • Función para obtener el monto recolectado.
  • Función para obtener el total de donaciones.
  • Función para obtener la posición en el ranking.

Y en doctrine http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html

Ya con eso quedo funcional.

Saludos.