В моем проекте Symfony2 я получаю упорядоченный набор идентификаторов сущностей из индекса Elasticsearch. Затем я передаю этот список в 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, и я полагаю, что столкнусь с той же проблемой, что и выше.
ИЗМЕНИТЬ 1. Я знаю, что могу поместить базовые данные прямо в вызов select()
.
ИЗМЕНИТЬ 2. Я сдался и поместил голые данные в вызов select()
(чего я хотел избежать). Это сработало, но затем возникла необходимость реализовать предложение Кока об использовании ключевого слова HIDDEN
, чтобы Doctrine не возвращал array(Object i, array(fixed_order))
вместо просто Object i
.