sql >> Database >  >> RDS >> Mysql

QueryBuilder/Doctrine Selecteer lid worden van groupby

Ik ga ervan uit dat je alleen deze velden nodig hebt en niet je AdminGoals entiteit. Op uw AdminGoalsRepository je kunt zoiets als dit doen:

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

Houd er rekening mee dat het return-object een array van rijen zal zijn, elke rij is een bijbehorende array met sleutels zoals de bovenstaande toewijzingen.

Bewerken

Na het bijwerken van de vraag, ga ik mijn voorgestelde functie wijzigen, maar laat het bovenstaande voorbeeld staan ​​als andere mensen het verschil willen zien.

Allereerst, aangezien dit een unidirectionele ManyToOne is tussen AdminSavings en AdminGoals , de aangepaste query moet in AdminSavingsRepository staan (niet zoals hierboven ). En aangezien u een geaggregeerd veld wilt dit zal "breken" sommige van uw gegevens ophalen. Probeer zoveel mogelijk OOP te behouden als u niet alleen sjablonen weergeeft.

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


  1. Tomcat jdbc-verbindingspool - geannuleerde transactie terugdraaien

  2. Benchmarking Postgres-XL

  3. SHA1-hashwaarden opslaan in MySQL

  4. Een MySQL-database initialiseren die is geïmplementeerd in een AWS EKS