Php QueryBuilder/Doctrine选择加入groupby

Php QueryBuilder/Doctrine选择加入groupby,php,mysql,symfony,doctrine-orm,query-builder,Php,Mysql,Symfony,Doctrine Orm,Query Builder,因此,最近我一直在思考这个问题,但由于缺乏对doctrine2和symfony query builder的开发,目前还无法找到解决方案 我有两张桌子: 目标:id,用户id,目标值。。。 节省:id、目标\ id、金额 我需要从目标中进行选择(我表中的所有信息都来自目标表,除了我需要从每个目标的储蓄表中得出一个总和(金额),这样我就可以向用户显示他为他的目标储蓄了多少) 这是MySQL查询: select admin_goals.created, admin_goa

因此,最近我一直在思考这个问题,但由于缺乏对doctrine2和symfony query builder的开发,目前还无法找到解决方案

我有两张桌子: 目标:id,用户id,目标值。。。 节省: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
它返回我想要的,但我不知道如何用条令或查询生成器实现它,您能给我两种方式的示例吗? 非常感谢!

如果使用createQuery(),则可以执行以下操作:

    $dqlStr = <<<"DSQL"
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
DSQL;

    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery($dqlStr);
    $query->getResult();
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();
}
$dqlStr=createQuery($dqlStr);
$query->getResult();

另一方面,如果您想使用createQueryBuilder(),可以检查此链接:

我假设您只需要此字段,而不需要您的
AdminGoals
实体。在您的
AdminGoalsRepository
上,您可以执行以下操作:

    $dqlStr = <<<"DSQL"
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
DSQL;

    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery($dqlStr);
    $query->getResult();
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
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();
}
奖金
我得到一个:试图调用类“AppBundle\Entity\Goal”上的方法“createQueryBuilder”。控制器:$x=$goal->getGoalsByUser($user);//$目标=新目标()。。。在我将您的函数放在目标实体中时,我是否做错了什么?正如我所说,这必须在您的
AppBundle\Entity\GoalRepository
上。如果您没有,您可以使用它。谢谢您的回答,我终于生成了我的存储库并运行了该功能。。我在“savings WHERE”附近得到一个:[语义错误]第0行第173列:错误:类AppBundle\Entity\Goal没有名为adminSavings的关联。。这基本上意味着我在表中没有adminsavings(这是sum)字段,但我不想为目标更改表结构,如果我想显示其他表中的3-4个sum(),我需要为我想显示的每个sum()创建一个表吗?请参阅更新,
savings\u值
与来自join的
savings
崩溃。还有,我刚才从你的查询中想到的许多名字。确保在实体属性命名时写入它们。我必须在这一行写入什么?->join('goal.adminsaviews','savings',join::WITH))??我的目标中没有行政储蓄。。我在储蓄表中有目标id。。这么多的储蓄都与一个目标挂钩,我也尝试过你的解决方案,但它不起作用,我最初得到一个sintax错误,没有报价?还是不需要它们?如果我在类“条令\DBAL\Connection”上加上引号,我会得到:试图调用方法“createQuery”。你想叫“createQueryBuilder”吗。。。。我只想运行一个简单的查询,天哪\我不是有意调用createQueryBuilder()。对于复杂的查询,使用QueryBuilder可能会造成混乱,您可能会浪费时间。我添加了“$em=$this->getDoctrine()->getManager();”更新!好的,我让它运行了,但我有一个错误:[语义错误]第0行,第151列“admin\u goals inner”附近:错误:未定义类“admin\u goals”。。错误似乎出现在admin_目标内部联接上。。这是人们编写多行字符串的方式之一:。您可以尝试的一件事是,在我更新时,不要在行前放置任何空格/制表符!这意味着您的原始sql查询有问题!必须正确定义实体。你可以这样做: