0

私は次のように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返された結果セット(基本的にはオブジェクトの配列)から小枝でこれを行う方法を理解できません

classesreferenceはとの間の参照テーブルでSpellあり、参照レコードCharacterClassで使用される場合のスペルレベルのフィールドも含まれています。CharacterClass

どんな助けでも大歓迎です。

4

1 に答える 1

0

さて、groupByの誤解が修正されたら、これに飛び込みましょう;)

まず、達成したいのは次のような2次元配列です。

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は、各行(1つのスペル)を反復処理し、レベルに対応する内部配列にスペルを追加するために使用されます。すでに述べたように、いくつかのもの(スペルレベルや配列内に格納するものなど)を変更する必要があるかもしれませんが、全体的な考え方は明確である必要があります。

于 2012-11-28T20:36:00.740 に答える