2015-04-02 90 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

你不必映射到數據庫中的字段,它可以是正常的分類字段