Использование 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);
Другие вопросы по тегам