2015-04-02 50 views
0

这是继续其他主题的问题:Symfony2中添加属性对象

QueryBuilder/Doctrine Select join groupby

请打开它,所以你可以看到有数据库模式。

我的问题是:

我有一个目标,一个目标,有很多积蓄。

这意味着如果您想为一个目标节省资金,您将添加一些储蓄,所以节省的费用通过编号链接到目标。

在那个主题中,有人谈到储蓄和目标之间的单向链接(我在储蓄表中有goal_id,但在目标表中没有saving_id)。

我想要做的是展现出表与目标信息,并追加到它收集的值(这是不是在数据库中)这个值是链接到目标的所有储蓄值的总和:

例如:

Goals: 
    id: 1 
    goal name: Goal1 
    .... 

    Savings: 
    id: 1 
    amount:10 
    goal_id: 1 

    id:2 
    amount:20 
    goal_id: 1 

当我查询数据库,我将获得与目标信息和现场收集金额表:在这种情况下,30。

我最初设法使查询得到我:

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 

但我想做的事symfony的方式,所以我用查询生成器,做了一个仓库,并没有得到相同的结果。

目标和储蓄之间唯一的联系是来自储蓄表的goal_id,这意味着使用查询生成器我必须从储蓄表开始..因为从目标表我没有foreign_key用于储蓄。

但现在的问题是,因为我从储蓄表开始,当显示目标时,我得到一个空的结果,那是因为最初目标没有储蓄。

首先您创建目标,然后创建储蓄。但是因为在Savings表中没有记录(我从头开始),因此我没有从Goals表中得到任何记录,因为我在这两个表上有一个连接。

$qb = $this->createQueryBuilder('admin_savings'); 

     $qb->select('SUM(admin_savings.value) AS savingValue') 
      ->addSelect('admin_goals.id AS id') 
      ->addSelect('admin_goals.created') 
      ->addSelect('admin_goals.description') 
      ->addSelect('admin_goals.goal_date') 
      ->addSelect('admin_goals.value') 
      ->addSelect('admin_budget.name') // daca vrei id atunci pune identity(admin_goals.categ_id)       admin_budget.name, x.name 
      ->join('admin_savings.goal_id', 'admin_goals', Join::WITH) 
      ->join('admin_goals.budget_categ', 'admin_budget', Join::WITH) //parametru 2 e numele de referinta in selectul mare ex: admin_budget, putea fi x 
     ->where($qb->expr()->eq('admin_goals.user_id', ':user')) 
     ->groupBy('admin_goals.id') 
     ->setParameter('user', $user); 

我明白,这是不可能的,所以我尝试了另一种方法,为什么没有我一般查询的目标实体,因为这是我希望看到的..

$repository = $this->getDoctrine()->getRepository('AppBundle:Goal'); 
$goals = $repository->findBy(array('user_id' => $userId)); 

和我做了一个函数在我SavingsRepository:

public function getSavingSumByGoal($goalId){ 

     $qb = $this->createQueryBuilder('saving'); 

     $qb->select('SUM(saving.value) AS savingValue') 
      ->where($qb->expr()->eq('saving.goal_id', ':goal')) 
      ->setParameter('goal', $goalId); 

     return $qb->getQuery()->getScalarResult(); 
    } 

所以现在我有与它的所有信息的目标实体,而不是量Sum从储蓄收集的,我需要以某种方式添加到我的$的目标对象。这是在我的控制器

foreach($goals as $goal_item){ 
      $savingSum=$SavingRepository->getSavingSumByGoal($goal_item->getId()); 
      if($savingSum){ 
       $goal_item->savingSum=$savingSum; 
      }else{ 
       $goal_item->savingSum=0.00; 
      } 
     } 

$ goal_item-> savingSum是一个虚构的财产,他不存在于$目标对象,我做了这是,我要插入一个例子savingSum不知何故在$目标对象。

我不想在实体创建另一个字段设置,因为那样的话我会在数据库中的空collumn,我不希望出现这种情况。我想保持我的表结构和实体,并且只在目标表中为目标添加所有储蓄额的总和。

但它没有工作。 我正在想我的小树枝中的foreach来执行我的功能,但我认为这不是一个好主意。

{% for goal in goals %} 
    <tr style=""> 
     <td>{{ goal.created|date('Y/m/d') }}</td> 
     <td>{{ goal.description|e }}</td> 
     <td>{{ goal.value|e }}</td> 
     <td>{{ goal.goal_date|date('Y/m/d') }}</td> 
     <td>{{ goal.name|e }}</td> 
     <td>{{ savingRepo->getSavingSumByGoal(goal.id)|e }} </td> 
     </td> 
     </tr> 
{% endfor %} 

这是一个不好的做法和它树枝不`吨的工作,但我知道人们在Zend和其他框架(你做的的foreach后(使用的方法),你对当前对象运行的函数(从foreach)ID和显示的基础上)

如果你有更好的想法如何做到这一点的symfony方式..我总是可以运行rawquery,它会工作,但那不是我想要的做..必须有办法做到这一点在面向对象的方式..请帮助。

谢谢!

回答

3

我不想在实体创建另一个字段设置,因为那样的话我会在数据库中的空collumn

你不必映射到数据库中的字段,它可以是正常的分类字段