2012-11-25 37 views
0

我有一個學說查詢如下...Symfony2中:我如何呈現一個結果到HTML分組記錄在輸出

$qb = $this->createQueryBuilder('s') 
      ->select('s, csr, c') 
      ->Join('s.classesreference', 'csr') 
      ->Join('csr.Class', 'c') 
      ->where('c.id = :id and csr.SpellLevel = :level') 
      ->setParameter('level', $level) 
      ->setParameter('id', $Class->getId()) 
      ->orderBy('s.Name','ASC') 
      ->orderBy('csr.SpellLevel') 
      ->getQuery(); 

在我的樹枝模板我想顯示此查詢的結果在一個嵌套的無序列表中。

<ul> 
    <li>Level 0 
     <ul> 
      <!-- Level zero spells here --> 
     </ul> 
    </li> 
    <li>Level 1 
     <ul> 
      <!-- Level one spells here --> 
     </ul> 
    </li> 
    <li>Level 2 
     <ul> 
      <!-- Level two spells here --> 
     </ul> 
    </li> 
    <li>Level 3 
     <ul> 
      <!-- Level three spells here --> 
     </ul> 
    </li> 
</ul> 

我不能弄清楚如何從返回的結果集(基本上Spell對象數組)

classesreference爲此在樹枝是SpellCharacterClass之間的參照表還包含一個當被引用的CharacterClass記錄使用時,該字段爲法術等級。

任何幫助表示讚賞。

+0

如果按spellLevel分組,每個關卡只有一個結果?所以你的第一個級別將在$ result [0]中等等。也許你可以添加更多關於你的數據結構的信息。 – Sgoettschkes

+0

我可能會誤解groupby ...我理解它會在結果集中與sortby一起收集具有相同值的記錄,然後應用於這些組。你如何建議我實現我想要的結果? – Hades

+0

好吧,在讀完一些東西之後,我誤解了GroupBy ...我仍然無法弄清楚如何做我想做的事情,儘管..更新了問題以反映我對理解的增加。 – Hades

回答

0

好吧,GROUPBY的誤解是固定後,讓我們深入到這一個;)

首先,你想達到什麼是二維數組是這樣的:

array(
    0 => array('Spell1', 'Spell4'), 
    1 => array(), 
    2 => array('Spell3'), 
    3 => array('Spell2'), 
); 

第一數組將包含每個法術等級和一系列法術。

這不能用MySQL單獨完成。 MySQL返回行,所以沒有辦法寫一個查詢,它會給你一個完美的數組。所以,你想要做的是寫一個查詢,讓你回到所有法術的級別。正如我不能完全掌握你的表的設計,下面需要一些工作,但它可能讓你一個想法:

$qb = $this->createQueryBuilder('s') 
      ->select('s, csr, c') 
      ->Join('s.classesreference', 'csr') 
      ->Join('csr.Class', 'c') 
      ->where('c.id = :id') 
      ->setParameter('id', $Class->getId()) 
      ->orderBy('s.Name','ASC') 
      ->orderBy('csr.SpellLevel') 
      ->getQuery(); 
$resultArray = $qb->getArrayResult(); 

$spellLevelArray = array(); 
foreach($resultArray AS $result) { 
    $spellLevel = $result['spelllevel']; 
    $spellLevelArray[$spellLevel][] = $result['spell']; 
} 

正如你所看到的,一個foreach用於遍歷每一行(這是一個咒語)並將該法術添加到對應於該等級的內部數組中。如上所述,你可能需要改變一些東西(比如spelllevel和你在數組中存儲的東西),但是總體思路應該是清楚的。

+0

感謝這...這是有幫助的......是不是有沒有辦法與Doctrine2拉這樣的事情使用DQL而不是自己寫循環? – Hades

+0

那麼,你可以用ORM來完成它的方法就是向你的Class對象中添加一個方法,比如'getSpellsForLevel($ level)',然後迭代所有法術並且回饋那個級別的法術。或者你可以查詢classreference類的具體級別和類,並迭代這些。 – Sgoettschkes

+0

標記爲答案。謝謝。我希望能有一個DQL語句,可以將結果返回到上面描述的數組格式。無論如何,感謝您的幫助。 – Hades

相關問題