Zakładam, że potrzebujesz tylko tych pól, a nie swoich AdminGoals
podmiot. W Twoim AdminGoalsRepository
możesz zrobić coś takiego:
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();
}
Pamiętaj, że obiekt zwracany będzie tablicą wierszy, każdy wiersz jest powiązaną tablicą z kluczami, takimi jak powyższe mapowania.
Edytuj
Po zaktualizowaniu pytania zamierzam zmienić sugerowaną funkcję, ale zostawię powyższy przykład, jeśli inne osoby chciałyby zobaczyć różnicę.
Po pierwsze, ponieważ jest to jednokierunkowe ManyToOne między AdminSavings
i AdminGoals
, zapytanie niestandardowe powinno znajdować się w AdminSavingsRepository
(nie jak powyżej ). Ponadto, ponieważ potrzebujesz pola zagregowanego
to „złamie się” niektóre z Twoich danych są pobierane. Staraj się zachować jak najwięcej OOP, gdy nie tylko renderujesz szablony.
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'];
[...]
}
[...]
}