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