Je vais supposer que vous n'avez besoin que de ces champs et non de vos AdminGoals
entité. Sur votre AdminGoalsRepository
vous pouvez faire quelque chose comme ceci :
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();
}
Gardez à l'esprit que l'objet de retour sera un tableau de lignes, chaque ligne est un tableau associé avec des clés comme les mappages ci-dessus.
Modifier
Après avoir mis à jour la question, je vais modifier ma fonction suggérée, mais je vais laisser l'exemple ci-dessus si d'autres personnes souhaitent voir la différence.
Tout d'abord, puisqu'il s'agit d'un ManyToOne unidirectionnel entre AdminSavings
et AdminGoals
, la requête personnalisée doit être dans AdminSavingsRepository
(pas comme ci-dessus ). Aussi, puisque vous voulez un champ agrégé
cela va "casser" certaines de vos récupérations de données. Essayez de rester autant de POO lorsque vous ne vous contentez pas de rendre des modèles.
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'];
[...]
}
[...]
}