1

私はSymfony2とDoctrine2を使用していますが、このクエリに問題があります:

    $query = $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)');
    $result = $query->getArrayResult();

そして、私は常にa.id、つまり1、4、12の順に結果を取得しますが、IDのリストとして順序付けられた結果を表示したいのです:4、12、1。

更新 @BramGerritsentコメントのおかげで、カスタムDQL関数FIELDを登録したので、これが私が行ったことです。

  1. MyBundle / DQL / Field.phpに、次のコードを挿入しました(https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Field.php)(変更したばかりですある名前空間namespace MyBundle\DQL;

  2. 次に、Symfony2のドキュメント(http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html)に示されているように、config.ymlに以下を追加します。

    orm:auto_generate_proxy_classes: "%kernel.debug%" entity_managers:default:auto_mapping:true dql:string_functions:field:MyBundle \ DQL \ Field

  3. したがって、次のクエリ$ query =$em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY FIELD(4,12,1)');を記述しましたが、このエラーが発生します:[Syntax Error] line 0, col 75: Error: Expected end of string, got '('

4

2 に答える 2

5

FIELDMySql関数を調べる必要があります。

ネイティブMySqlでは、次のようなことを行います。

ORDER BY FIELD(a.id,4,12,1)

フィールド関数はDoctrine2ディストリビューションの一部ではありませんが、DoctrineExtensionsから取得できます

Doctrine 2での関数の使用の詳細については、このStackOverflowの投稿を参照してくださいFIELD

編集

クエリを使用してテストしましたが、同じ構文エラーが発生しました。次のクエリは私のために働きます。ORDER BY field(a.id,4,12,1)直接使用できない理由はわかりませんがHIDDEN、最初に選択範囲にフィールドを作成する必要があります。

SELECT a, field(a.id,4,12,1) as HIDDEN field FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY field

EDIT2

私はさらにデバッグと調査を行いましたが、DQLパーサーはorderby句の文字列関数をサポートしていないようです。この問題を修正し、プルリクエストを作成しました。

于 2013-03-05T09:11:57.270 に答える
0

FIELD関数ほど良くはありませんが、機能するはずです。

  SELECT output.a FROM (
    SELECT a, ( CASE WHEN a.id = 4 THEN 1 WHEN a.id = 12 THEN 2 a.id = 1 THEN 3 END ) ord FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)) output ORDER BY output.ord
于 2013-03-05T09:18:08.810 に答える