2012-01-10 16 views
5

Investigué mucho sobre esto y estoy seguro de que la respuesta es no, pero me encantaría probar que no.Uso de REGEXP en Doctrine 2.x ORM

Me gustaría ejecutar una consulta escrita en DQL que contiene la operación REGEXP. Por ejemplo:

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'); 

(Esta es una expresión regular simple y me doy cuenta de que se podría hacer como quiera, pero es sólo un ejemplo - mi expresión verdadera expresión regular es más complicado)

He examinado la clase Doctrine \ ORM \ Query \ Expr, más la clase QueryBuilder. No veo soporte para REGEXP. Alguien en SO tiene una publicación que dice que usaron la clase Expr, pero esto en realidad no funciona (declararon que no se había probado).

¿Alguna idea de cómo ejecutar REGEXP en DQL sin escribir SQL directamente? TIA.

Respuesta

3

El problema no es tanto que Query Builder no pueda crear consultas para la funcionalidad REGEXP (no estándar) en MySQL, sino que incluso si puede generar su consulta, no hay manera de que el analizador DQL lo entienda sin hacerlo algo al respecto.

Ese "algo" es ampliar el DQL de Doctrine para comprender la sintaxis de la expresión regular. Esto es factible al extender el DQL como se describe en in a blog post.

Para obtener más información estudiar el código de la MySQL part of DoctrineExtensions

+0

enlace Bad, en la entrada de blog , ¿ya no está actualizado (doctrina1)? –

+1

@PetterSoderlund corregido –

+0

Una cosa a tener en cuenta: tiene que agregar un operador de comparación al final de REGEXP o de lo contrario, Doctrine lo rechazará. Doctrine requiere que todas las cláusulas tengan un operador de comparación aunque REGEXP no lo requiera – Patrick

1

No se puede hacer esto con Doctrine2 por el momento. Puede agregar funciones personalizadas, pero REGEXP no es una función, sino un operador de comparación. Todavía no hay soporte para los operadores de comparación de aduanas en Doctrine2.

mirada en este tema del foro: https://groups.google.com/group/doctrine-user/browse_thread/thread/b98e37fc296c8183/06782192719156c6?lnk=gst&q=regexp#06782192719156c6

Debe utilizar SQL Native: http://www.doctrine-project.org/docs/orm/2.1/en/reference/native-sql.html

0

Es posible hacer lo siguiente, aunque no es tan bonita:

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