sql >> Base de Datos >  >> RDS >> Mysql

QueryBuilder/Doctrine Seleccione unirse a groupby

Voy a suponer que solo necesita estos campos y no sus AdminGoals entidad. En su AdminGoalsRepository puedes 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, cambiaré la función sugerida, pero dejaré el ejemplo anterior si a otras personas les gustaría ver la diferencia.

Lo primero es lo primero, ya que se trata de un ManyToOne unidireccional entre AdminSavings y AdminGoals , la consulta personalizada debe estar en AdminSavingsRepository (no como arriba ). Además, dado que desea un campo agregado esto "romperá" parte de su búsqueda de datos. Trate de mantener la mayor cantidad de 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();
}

Bonificación

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'];
        [...]
    }
    [...]
}