3

私はこのDoctrineクエリを受け取りました:

        select upper(substring(e.name, 1, 1)) first_letter
        from Application\Models\Exercise e
        group by first_letter
        order by first_letter asc

ただし、次のメッセージで例外がスローされます。

Error: 'first_letter' does not point to a Class. 

group byとを省略すればorder by動作します。

この場合、ネイティブクエリを使用する必要がありますか、それともクライアントコードで並べ替えとグループ化を行う必要がありますか(データベース内のデータの量によっては、おそらくあまり良い考えではありません...)、またはこのクエリを機能させることは可能ですか? ?

ありがとう!


編集:

これは私の現在のアプローチであり、それほど良いものではありませんが、データベースに多くのデータがないため、現時点では機能します。

    $tmpResult = $this->getEntityManager()->createQuery('
        select upper(substring(e.name, 1, 1)) first_letter
        from Application\Models\Exercise e
    ')->getResult();

    $groupedAndSortedResult = array();

    foreach($tmpResult as $row) {
        $groupedAndSortedResult[$row['first_letter']] = $row['first_letter'];
    }

    sort($groupedAndSortedResult);

    return array_values($groupedAndSortedResult);
4

3 に答える 3

2

私はあなたがこの質問に自分で答えたことを知っていますが、あなたが使ってみたかどうか疑問に思っていますDISTINCT

select DISTINCT upper(substring(e.name, 1, 1)) first_letter
from Application\Models\Exercise e    
order by e.name asc

による注文は、この場合e.nameと同等です。first_letter

于 2010-10-26T17:38:31.073 に答える
1

DQLDoctrineは常に結果をエンティティにマップしようとするため、(少なくとも私が見つけることができなかった)経由でこれを行う良い方法はないようです。接続を使用してネイティブクエリを実行することになりましたPDO。リポジトリで使用するコードは次のとおりです。

    return $this->getEntityManager()->getConnection()->executeQuery('
        select upper(left(tl_exercise.name, 1)) as first_letter
        from tl_exercise
        group by first_letter
        order by first_letter asc
    ')->fetchAll(\PDO::FETCH_COLUMN);

少なくとも、クライアントコードの並べ替え/グループ化を取り除きました。また、デフォルトLEFT()では使用できない機能を使用できます(ただし、使用できます)。DQLSUBSTRING()


更新:とを使用してこれを行う方法がEntityManager::createQueryあります。rojocaの回答DQLを参照してください。

于 2010-10-24T13:32:19.230 に答える
0

私の推測では、first_letterがエンティティになることを探しています。これは、selectステートメントの計算属性を基準として使用できない一部のSQLクエリでも同様の問題です。次のことを試してください。

select upper(substring(e.name, 1, 1)) first_letter
from Application\Models\Exercise e
group by upper(substring(e.name, 1, 1))
order by upper(substring(e.name, 1, 1)) asc
于 2010-10-22T17:57:08.190 に答える