私の 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_string
select()
FIELD()
最初に関数を呼び出しに入れようとしましたorderBy()
が、これがカスタム DQL 関数呼び出し用に解析されているようには見えず、上記と同じ問題に遭遇すると思います。
EDIT 1ベースデータを直接select()
呼び出しに入れることができることは承知しています。
EDIT 2私はあきらめて、裸のデータをselect()
呼び出しに入れました(これは避けたかったのです)。HIDDEN
これはうまくいきましたが、キーワードを使用して Doctrine が戻るのを防ぐというarray(Object i, array(fixed_order))
Kocの提案を実装する必要が生じました。 Object i