Symfony2:如何将结果集呈现到输出中的HTML分组记录中

时间:2012-11-25 01:45:05

标签: symfony doctrine doctrine-orm group-by twig

我有一个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中执行此操作

classesreferenceSpellCharacterClass之间的参考表,其中包含被引用的CharacterClass记录使用时拼写等级的字段。

感谢任何帮助。

1 个答案:

答案 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和你在数组中存储的东西),但总的想法应该是清楚的。