AdminGoals
ではなく、このフィールドのみが必要であると想定します。 実在物。 AdminGoalsRepository
次のようなことができます:
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();
}
戻りオブジェクトは行の配列であり、各行は上記のマッピングのようなキーに関連付けられた配列であることに注意してください。
編集
質問を更新した後、提案された機能を変更しますが、他の人が違いを確認したい場合は、上記の例を残します。
まず最初に、これはAdminSavings
間の単方向のManyToOneであるためです。 およびAdminGoals
、カスタムクエリはAdminSavingsRepository
にある必要があります (上記とは異なります )。また、集約フィールド
が必要なため これは「壊れる」 データフェッチの一部。テンプレートをレンダリングするだけではない場合は、できるだけ多くのOOPを維持するようにしてください。
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();
}
ボーナス
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'];
[...]
}
[...]
}