Как передать параметр пользовательской функции Doctrine2 в методе select () построителя запросов?

В моем проекте 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.


person Barry    schedule 03.12.2012    source источник


Ответы (2)


Начиная с Doctrine 2.2, вы можете использовать ключевое слово HIDDEN для поля доступности, чтобы не увлажнять их.

Пытаться:

->select('i, FIELD(i.id, :ids_string) AS HIDDEN fixed_order')
person Koc    schedule 03.12.2012
comment
Извините, но это не имеет никакого отношения к заданному вопросу. Не могли бы вы объяснить, что вы имеете в виду? - person Barry; 04.12.2012
comment
Теперь я понял, что вы имеете в виду, спасибо за предложение. Я обновил свой вопрос, чтобы объяснить, почему вы это предложили. - person Barry; 07.12.2012
comment
Если вы хотите выделить свой код, вам просто нужно поставить перед ним 4 пробела, добавлять `:) - person j0k; 07.12.2012

Вы собираетесь ударить себя, когда заметите проблему ...

Попробуйте перечитать свое предложение: «очевидно, он не« видит »: ids_string в методе select ()».

А затем внимательно посмотрите на свой код: 'id_string' => implode (',', $ itemIds)

person RobMasters    schedule 07.12.2012
comment
Я был готов ударить себя, но, к сожалению, это всего лишь опечатка в вопросе (которую я сейчас исправлю). Я все еще получаю ту же ошибку (которую я также добавлю к вопросу). Спасибо, что заметили это ... - person Barry; 07.12.2012