1

私の Symfony2 プロジェクトでは、Elasticsearch インデックスからエンティティ ID の順序付けられたセットを取得しています。次に、このリストを Doctrine2 に渡して、WHERE IN()呼び出しによって実際のエンティティを取得します。

これでは正しい順序で返されないため、MySQL 固有の関数を使用する必要があると思いますFIELD()。機能を許可するカスタム DQL 関数を作成しました。

だから今、次のコードを使用して Doctrine クエリ オブジェクトを作成していますが、パラメーターはselect()メソッドに解析されていません。

$itemIds = array(4,8,2,1);

$this->getRepository()
    ->createQueryBuilder('i')
        ->select('i, FIELD(i.id, :ids_string) AS HIDDEN fixed_order')
        ->where('i.id IN (:ids)')
        ->setParameters(array(
            'ids_string' => implode(',', $itemIds),
            'ids' => $itemIds))
        ->orderBy('fixed_order', 'ASC')
    ->getQuery()
;

これはエラーで失敗するため、メソッドで"Invalid parameter number: number of bound variables does not match number of tokens"を「認識」していないようです。:ids_stringselect()

FIELD()最初に関数を呼び出しに入れようとしましたorderBy()が、これがカスタム DQL 関数呼び出し用に解析されているようには見えず、上記と同じ問題に遭遇すると思います。

EDIT 1ベースデータを直接select()呼び出しに入れることができることは承知しています。

EDIT 2私はあきらめて、裸のデータをselect()呼び出しに入れました(これは避けたかったのです)。HIDDENこれはうまくいきましたが、キーワードを使用して Doctrine が戻るのを防ぐというarray(Object i, array(fixed_order))Kocの提案を実装する必要が生じました。 Object i

4

2 に答える 2

0

問題に気づいたとき、あなたは自分自身を蹴るつもりです...

あなたの文を読み直してみてください:「どうやらselect()メソッドで:ids_stringを「見ていない」ようです」。

そして、あなたのコードをよく見てください: 'id_string' => implode(',', $itemIds)

于 2012-12-07T09:50:05.487 に答える
0

Doctrine 2.2 からHIDDENavability フィールドのキーワードをハイドレーションなしで順番に使用できます。

試す:

->select('i, FIELD(i.id, :ids_string) AS HIDDEN fixed_order')
于 2012-12-03T19:46:38.957 に答える