Пользовательский тип поля формы и пользовательская функция для него - PullRequest
0 голосов
/ 09 декабря 2011

Это мой первый вопрос здесь, но я надеюсь, что я получу большую помощь :) Итак, вот проблема, с которой я столкнулся несколько дней назад.

Для проекта мне нужна пользовательская формаполе, которое позволит пользователю выбрать числовой диапазон.

Пример:

Number: greater-than 3 and lower-or-equal-than 5

Мне удалось создать свой тип поля формы просто отлично.Я сделал собственный метод в своем хранилище, который добавляет часть предложения where и все работает.

Недавно мне понадобился тот же самый компонент в нескольких других местах моего проекта.Теперь я ненавижу дублирование, поэтому я решил, что логика, которая модифицирует DQL, должна находиться в центральном месте.Согласно функциям, приведенным в Doctrine, это должна быть UDF (пользовательская функция).

Я попытался реализовать UDF, но безрезультатно.

Мне удалосьизучить и использовать компоненты Parser и Lexer пакета Doctrine ORM, но мне кажется, что этого недостаточно.

Для подробного объяснения приведем результирующий запрос:

SELECT something FROM SomeBundle:Something something
WHERE in_range(someProperty, gt, 3, lte, 5)

Он должен быть преобразован в:

SELECT sometable.* FROM sometable sometable
WHERE someProperty > 3 AND someProperty <= 5

Я в порядке его синтаксического анализа, но Doctrine2 требует оператор условия после UDF, поэтому синтаксис должен быть примерно таким:

SELECT sometable.* FROM sometable sometable
WHERE in_range(someProperty, gt, 3, lte, 5) = 1

Используя этот синтаксис, все равно необходимо назначить значения для всех параметров (например, gt и lte), что также потребует отдельной функции, которая будет отслеживать, какие параметры уже были назначены, а какие - нет.Кроме того, это решение, похоже, не работает, так как у синтаксического анализатора, похоже, возникают проблемы при разборе аргументов моей функции: D

Все, что мне нужно, - это простой модификатор запроса.

Если возможно, я бы хотелчтобы добиться лучшего синтаксиса, а также.Нечто подобное было бы приемлемо:

someProperty is in_range(gt, 3, lte, 5)

Есть мысли?Заранее спасибо всем участникам!

PS Согласно сайту Doctrine2, UDF предназначены для "реализации специфических функций поставщика".Возможно, я не ищу правильное решение для моей проблемы.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

В итоге я реализовал свой собственный класс Expr.

Некоторые преимущества включают в себя:

  • вы не обязаны использовать конкретные параметры, поэтому вы можете передать себе все, что вам нужно
  • вы можете создать свой запрос так, как вам нужно, потому что это метод __toString (), который возвращает запрос, который нужно использовать

Здесь следует отметить, что в настоящее время Doctrine2 не поддерживает пользовательскиеКлассы Expr, поэтому, чтобы использовать мой, мне пришлось использовать метод __toString () и проверить, не является ли результат не пустым, прежде чем передавать его в методы andx () / orx () построителя запросов.

0 голосов
/ 09 декабря 2011

Почему бы вам не использовать BETWEEN (http://www.doctrine -project.org / docs / orm / 2.1 / en / reference / dql-doctrine-query-language.html # dql-select-examples)?

...