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