2012-01-10 3 views
5

Ho fatto ricerche su questo argomento e sono sicuro che la risposta è no, ma mi piacerebbe provare che si è rivelato sbagliato.Utilizzo di REGEXP in Doctrine 2.x ORM

Mi piacerebbe eseguire una query scritta in DQL che contiene l'operazione REGEXP. Per esempio:

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

alias

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

(Questo è un semplice regex e mi rendo conto che potrebbe essere fatto come piace, ma è solo un esempio - la mia espressione vera espressione regolare è più complicato)

Ho esaminato la classe Doctrine \ ORM \ Query \ Expr, più la classe QueryBuilder. Non vedo alcun supporto per REGEXP. Qualcuno su SO ha un post che dice che hanno usato la classe Expr, ma questo in realtà non funziona (hanno dichiarato che non è stato testato).

Qualche idea su come eseguire REGEXP in DQL senza scrivere direttamente SQL? TIA.

risposta

3

Il problema non è tanto che Query Builder non può creare query per la funzionalità REGEXP (non standard) in MySQL ma più che anche se è possibile generare la query, non c'è modo che il parser DQL lo capisca senza fare qualcosa a riguardo

Quel "qualcosa" sta estendendo il DQL di Doctrine per comprendere la sintassi delle espressioni regolari. Ciò è possibile estendendo il DQL come descritto in in a blog post.

Per ulteriori informazioni studiare il codice del MySQL part of DoctrineExtensions

+0

cattivo collegamento sul blogpost , non è più aggiornato (doctrine1)? –

+1

@PetterSoderlund corretto –

+0

Una cosa da notare: è necessario aggiungere un operatore di confronto alla fine del REGEXP, altrimenti Doctrine lo respingerà. Doctrine richiede che tutte le clausole where abbiano un operatore di confronto anche se REGEXP non lo richiede – Patrick

1

Non si può fare questo con Doctrine2 per il momento. È possibile aggiungere una funzione personalizzata, ma REGEXP non è una funzione, ma un operatore di confronto. Non esiste ancora alcun supporto per gli operatori di confronto doganale in Doctrine2.

Guardate questo thread del forum: https://groups.google.com/group/doctrine-user/browse_thread/thread/b98e37fc296c8183/06782192719156c6?lnk=gst&q=regexp#06782192719156c6

Si consiglia di utilizzare SQL Native: http://www.doctrine-project.org/docs/orm/2.1/en/reference/native-sql.html

0

E 'possibile effettuare le seguenti operazioni, anche se non abbastanza:

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