0

我有一个如下的教义查询......

$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是一个引用表,SpellCharacterClass被引用CharacterClass记录使用时,它还包含一个拼写级别字段。

任何帮助表示赞赏。

4

1 回答 1

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 用于遍历每一行(即一个法术)并将法术添加到与级别对应的内部数组中。如前所述,您可能需要更改一些内容(例如法术级别和存储在数组中的内容),但总体思路应该很清楚。

于 2012-11-28T20:36:00.740 回答