Это мой первый вопрос здесь, но я надеюсь, что я получу большую помощь :) Итак, вот проблема, с которой я столкнулся несколько дней назад.
Для проекта мне нужна пользовательская формаполе, которое позволит пользователю выбрать числовой диапазон.
Пример:
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 предназначены для "реализации специфических функций поставщика".Возможно, я не ищу правильное решение для моей проблемы.Есть предложения?