我有一个Doctrine查询如下......
$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();
在我的Twig模板中,我想在嵌套的无序列表中显示此查询的结果。
<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
个对象的数组)中的twig中执行此操作
classesreference
是Spell
和CharacterClass
之间的参考表,其中包含被引用的CharacterClass
记录使用时拼写等级的字段。
感谢任何帮助。
答案 0 :(得分: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和你在数组中存储的东西),但总的想法应该是清楚的。