Mysql
 sql >> Database >  >> RDS >> Mysql

QueryBuilder/Dottrina Seleziona unisciti a groupby

Presumo che tu abbia bisogno solo di questi campi e non dei tuoi AdminGoals entità. Sul tuo AdminGoalsRepository puoi fare qualcosa del genere:

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

Tieni presente che l'oggetto restituito sarà un array di righe, ogni riga è un array associato con chiavi come le mappature sopra.

Modifica

Dopo aver aggiornato la domanda, cambierò la mia funzione suggerita ma lascerò l'esempio sopra se altre persone vorrebbero vedere la differenza.

Per prima cosa, poiché questo è un ManyToOne unidirezionale tra AdminSavings e AdminGoals , la query personalizzata dovrebbe trovarsi in AdminSavingsRepository (non come sopra ). Inoltre, poiché desideri un campo aggregato questo "spezzerà" alcuni dei tuoi dati che stanno recuperando. Cerca di rimanere tanto OOP quando non esegui solo il rendering di modelli.

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