QueryBuilder / Doctrine Seleccionar unir groupbyby

Recientemente, he estado pensando y todavía no puedo encontrar una solución a este problema debido a mi falta de desarrollo con doctrine2 y symfony query builder.

Tengo 2 tablas: Metas: id, user_id, target_value … Ahorros: id, goal_id, amount

Y necesito hacer una selección de objectives (todas las informaciones en mi tabla son de la tabla de objectives, excepto que necesito hacer una SUMA (cantidad) de la tabla de ahorro en cada objective, para poder mostrarle al usuario cuánto hizo el ahorró para su objective)

Esta es la consulta de MySQL:

select admin_goals.created, admin_goals.description, admin_goals.goal_date, admin_goals.value, admin_goals.budget_categ, sum(admin_savings.value) from admin_goals inner join admin_savings on admin_savings.goal_id=admin_goals.id where admin_goals.user_id=1 group by admin_goals.id 

Devuelve lo que quiero, pero no tengo idea de cómo implementarlo con la doctrine o el generador de consultas, ¿podría mostrarme un ejemplo de las dos maneras? enter image description here ¡Lo aprecio mucho! enter image description here

Voy a suponer que necesita este campo solamente y no su entidad AdminGoals . En su AdminGoalsRepository puede hacer algo como esto:

 public function getGoalsByUser(User $user) { $qb = $this->createQueryBuilder('goal'); $qb->select('SUM(savings.value) AS savings_value') ->addSelect('goal.created') ->addSelect('goal.description') ->addSelect('goal.goalDate') ->addSelect('goal.value') ->addSelect('goal.budgetCat') //is this an entity? it will be just an ID ->join('goal.adminSavings', 'savings', Join::WITH)) ->where($qb->expr()->eq('goal.user', ':user')) ->groupBy('goal.id') ->setParameter('user', $user); return $qb->getQuery()->getScalarResult(); } 

Tenga en cuenta que el objeto de retorno será una matriz de filas, cada fila es una matriz asociada con claves como las asignaciones anteriores.

Editar

Después de actualizar la pregunta, voy a cambiar mi función sugerida pero voy a dejar el ejemplo anterior si a otras personas les gustaría ver la diferencia.

Lo primero es lo primero, dado que se trata de un ManyToOne unidireccional entre AdminSavings y AdminGoals , la consulta personalizada debe estar en AdminSavingsRepository ( no como se AdminSavingsRepository anteriormente ). Además, dado que desea un campo agregado, esto “romperá” parte de su recuperación de datos. Trate de mantener tanto OOP cuando no solo esté renderizando plantillas.

 public function getSavingsByUser(User $user) { $qb = $this->createQueryBuilder('savings'); //now we can use the expr() function $qb->select('SUM(savings.value) AS savings_value') ->addSelect('goal.created') ->addSelect('goal.description') ->addSelect('goal.goalDate') ->addSelect('goal.value') ->addSelect('goal.budgetCat') //this will be just an ID ->join('savings.goal', 'goal', Join::WITH)) ->where($qb->expr()->eq('goal.user', ':user')) ->groupBy('goal.id') ->setParameter('user', $user); return $qb->getQuery()->getScalarResult(); } 

Prima

 public function FooAction($args) { $em = $this->getDoctrine()->getManager(); $user = $this->getUser(); //check if user is User etc depends on your config ... $savings = $em->getRepository('AcmeBundle:AdminSavings')->getSavingsByUser($user); foreach($savings as $row) { $savings = $row['savings_value']; $goalId = $row['id']; $goalCreated = $row['created']; [...] } [...] } 

Si usa createQuery (), entonces puede hacer algo como esto:

  $dqlStr = <<<"DSQL" select admin_goals.created, admin_goals.description, admin_goals.goal_date, admin_goals.value, admin_goals.budget_categ, sum(admin_savings.value) from admin_goals inner join admin_savings on admin_savings.goal_id=admin_goals.id where admin_goals.user_id=1 group by admin_goals.id DSQL; $em = $this->getDoctrine()->getManager(); $query = $em->createQuery($dqlStr); $query->getResult(); 

Por otro lado, si desea utilizar createQueryBuilder (), puede consultar este enlace: http://inchoo.net/dev-talk/symfony2-dbal-querybuilder/