Использование REGEXP в Doctrine 2.x ORM
Я много исследовал это, и я уверен, что ответ - нет, но я бы хотел оказаться неправым.
Я хотел бы выполнить запрос, написанный на DQL, который содержит операцию REGEXP. Например:
select * from assets
where campaign_id = 1
and fileName REGEXP 'godzilla*'
order by fileName desc
ака
$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 ответа
Проблема не столько в том, что Query Builder не может создавать запросы для (нестандартной) функциональности REGEXP в MySQL, а в том, что даже если вы можете сгенерировать свой запрос, DQL-парсер не сможет понять его без каких-либо действий.
Это "что-то" расширяет DQL Doctrine для понимания синтаксиса регулярных выражений. Это можно сделать, расширив DQL, как описано в сообщении в блоге.
Для получения дополнительной информации изучите код части MySQL DoctrineExtensions
Вы не можете сделать это с Doctrine2 на данный момент. Вы можете добавить пользовательскую функцию, но REGEXP - это не функция, а оператор сравнения. В Doctrine2 пока нет поддержки операторов сравнения таможен.
Посмотрите эту ветку форума: https://groups.google.com/group/doctrine-user/browse_thread/thread/b98e37fc296c8183/06782192719156c6?lnk=gst&q=regexp
Вы должны использовать собственный SQL: http://www.doctrine-project.org/docs/orm/2.1/en/reference/native-sql.html
Можно сделать следующее, хотя и не так красиво:
$builder->add('select', 'a.fileName')
->add('from', '\Company\Bundle\Entity\Asset a')
->add('where', 'a.someField REGEXP '.$someRegex);