所以最近我一直在想,因为我没有使用doctrine2和symfony查询生成器进行开发,所以还找不到解决这个问题的方法。
我有两张桌子:
目标:id,用户id,目标值。。。
储蓄:身份证、目标证、金额
我需要从目标中进行选择(我表中的所有信息都来自目标表,除了我需要从每个目标的储蓄表中进行总和(金额),这样我就可以向用户显示他为实现目标节省了多少钱)
这是MySQL查询:

    select

    admin_goals.created,
    admin_goals.description,
    admin_goals.goal_date,
    admin_goals.value,
    admin_goals.budget_categ,
    sum(admin_savings.value)

    from admin_goals
inner join admin_savings on admin_savings.goal_id=admin_goals.id
    where admin_goals.user_id=1
    group by admin_goals.id

它返回我想要的,但我不知道如何实现它与条令或查询生成器,你能给我一个例子,在这两种方式?
我非常感谢!

最佳答案

我假设您只需要这个字段,而不需要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();
}

请记住,返回对象将是一个行数组,每一行都是一个关联数组,其键与上面的映射类似。
编辑
在更新问题之后,我将更改我建议的函数,但是如果其他人希望看到差异,我将离开上面的示例。
首先,由于这是AdminSavingsAdminGoals之间的单向ManyToOne,自定义查询应该在AdminSavingsRepository中(与上面不同)。另外,由于您想要aggregated field这将“中断”一些数据获取。在不只是渲染模板的情况下,尽量保持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'];
        [...]
    }
    [...]
}

09-25 21:16