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
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.
@miguelplazasr
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.
@iBet7o