Mysql
 sql >> Base de données >  >> RDS >> Mysql

QueryBuilder/Doctrine Sélectionnez rejoindre groupby

Je vais supposer que vous n'avez besoin que de ces champs et non de vos AdminGoals entité. Sur votre AdminGoalsRepository vous pouvez faire quelque chose comme ceci :

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();
}

Gardez à l'esprit que l'objet de retour sera un tableau de lignes, chaque ligne est un tableau associé avec des clés comme les mappages ci-dessus.

Modifier

Après avoir mis à jour la question, je vais modifier ma fonction suggérée, mais je vais laisser l'exemple ci-dessus si d'autres personnes souhaitent voir la différence.

Tout d'abord, puisqu'il s'agit d'un ManyToOne unidirectionnel entre AdminSavings et AdminGoals , la requête personnalisée doit être dans AdminSavingsRepository (pas comme ci-dessus ). Aussi, puisque vous voulez un champ agrégé cela va "casser" certaines de vos récupérations de données. Essayez de rester autant de POO lorsque vous ne vous contentez pas de rendre des modèles.

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();
}

Bonus

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