Mysql
 sql >> Datenbank >  >> RDS >> Mysql

QueryBuilder/Doctrine Wählen Sie groupby beitreten

Ich gehe davon aus, dass Sie nur diese Felder benötigen und nicht Ihre AdminGoals Einheit. In Ihrem AdminGoalsRepository Sie können so etwas tun:

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

Denken Sie daran, dass das Rückgabeobjekt ein Array von Zeilen ist, jede Zeile ist ein zugeordnetes Array mit Schlüsseln wie den obigen Zuordnungen.

Bearbeiten

Nachdem ich die Frage aktualisiert habe, werde ich meine vorgeschlagene Funktion ändern, aber das obige Beispiel verlassen, wenn andere Leute den Unterschied sehen möchten.

Das Wichtigste zuerst, da dies ein unidirektionales ManyToOne zwischen AdminSavings ist und AdminGoals , sollte sich die benutzerdefinierte Abfrage im AdminSavingsRepository befinden (nicht wie oben ). Außerdem möchten Sie ein aggregiertes Feld dies wird "brechen" einige Ihrer Daten abrufen. Versuchen Sie, so viel OOP zu bleiben, wenn Sie nicht nur Vorlagen rendern.

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