Использование REGEXP в Doctrine 2.x ORM - PullRequest
5 голосов
/ 11 января 2012

Я много исследовал это, и я уверен, что ответ - нет, но я бы хотел оказаться не правым.

Я хотел бы выполнить запрос, написанный на DQL, который содержитREGEXP операция.Например:

select * from assets 
where campaign_id = 1
and fileName REGEXP 'godzilla*'
order by fileName desc

aka

$builder->add('select', 'a.fileName')
        ->add('from',    '\Company\Bundle\Entity\Asset a')
        ->add('where',   'a.campaign=1')
        ->...REGEXP MAGIC...
        ->add('orderBy', 'a.fileName desc');

(Это простое регулярное выражение, и я понимаю, что это можно сделать как LIKE, но это всего лишь пример - мое настоящее выражение регулярного выражения болеесложный)

Я изучил класс Doctrine \ ORM \ Query \ Expr, а также класс QueryBuilder.Я не вижу поддержки для REGEXP.У кого-то в SO есть сообщение о том, что они используют класс Expr, но на самом деле это не работает (они заявили, что оно не было проверено).

Есть идеи, как выполнить REGEXP в DQL без написания прямого SQL?ТИА.

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Проблема не столько в том, что Query Builder не может создавать запросы для (нестандартной) функциональности REGEXP в MySQL, но еще в том, что даже если вы можете сгенерировать свой запрос, DQL-парсер не сможет понять его, не делая ничегооб этом.

Это "что-то" расширяет DQL Doctrine для понимания синтаксиса регулярных выражений.Это можно сделать, расширив DQL, как описано в сообщении в блоге .

. Для получения дополнительной информации изучите код части MySQL DoctrineExtensions

1 голос
/ 11 января 2012

Вы не можете сделать это с Doctrine2 на данный момент.Вы можете добавить пользовательскую функцию, но REGEXP - это не функция, а оператор сравнения.В Doctrine2 пока нет поддержки операторов сравнения таможен.

Посмотрите на эту ветку форума: https://groups.google.com/group/doctrine-user/browse_thread/thread/b98e37fc296c8183/06782192719156c6?lnk=gst&q=regexp#06782192719156c6

Вы должны использовать собственный SQL: http://www.doctrine -project.org /документы / ОРМ / 2,1 / ен / ссылки / нативной sql.html

0 голосов
/ 31 января 2014

Можно сделать следующее, хотя и не так красиво:

$builder->add('select', 'a.fileName')
        ->add('from',    '\Company\Bundle\Entity\Asset a')
        ->add('where',   'a.someField REGEXP '.$someRegex);
...