2012-01-10 12 views
5

Mam wiele badań i jestem pewna, że ​​odpowiedź brzmi nie, ale chciałbym udowodnić, że jest nie tak.Używanie REGEXP w Doctrine 2.x ORM

Chciałbym wykonać kwerendę napisane w DQL, który zawiera operację REGEXP. Na przykład:

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

(Jest to prosta regex i zdaję sobie sprawę, można zrobić jak się podoba, ale to tylko przykład - mój wyraz prawdziwy regex jest bardziej skomplikowane)

Zajrzałem do klasy Doctrine \ ORM \ Query \ Expr oraz klasy QueryBuilder. Nie widzę wsparcia dla REGEXP. Ktoś z SO ma post informujący, że użył klasy Expr, ale tak naprawdę nie działa (stwierdzili, że nie została przetestowana).

Każdy pomysł, jak wykonać REGEXP w DQL bez pisania kodu SQL? TIA.

Odpowiedz

3

Problem polega nie tyle na tym, że Konstruktor kwerend nie może tworzyć zapytań dla (niestandardowej) funkcji REGEXP w MySQL, ale nawet jeśli można wygenerować zapytanie, nie ma możliwości, aby parser DQL zrozumiał to bez robienia coś o tym.

To "coś" rozszerza DQL Doctrine, aby zrozumieć składnię wyrażenia regularnego. Jest to możliwe poprzez rozszerzenie DQL zgodnie z opisem in a blog post.

Aby uzyskać więcej informacji studiować kod MySQL part of DoctrineExtensions

+0

Bad link na blogpost , czy nie jest już aktualny (doktryna 1)? –

+1

@PetterSoderlund naprawiony –

+0

Jedna rzecz do zapamiętania: musisz dodać operatora porównania na końcu REGEXP, inaczej Doctrine go odrzuci. Doctrine wymaga, aby wszystkie klauzule, w których klauzule mają operatora porównania, mimo że REGEXP tego nie wymaga – Patrick

1

Nie można tego zrobić z Doctrine2 za chwilę. Możesz dodać funkcję niestandardową, ale REGEXP nie jest funkcją, ale operatorem porównania. W Doctrine2 nie ma jeszcze wsparcia dla operatorów porównania celnego.

Spójrz na tym wątku: https://groups.google.com/group/doctrine-user/browse_thread/thread/b98e37fc296c8183/06782192719156c6?lnk=gst&q=regexp#06782192719156c6

Należy użyć Native SQL: http://www.doctrine-project.org/docs/orm/2.1/en/reference/native-sql.html

0

Jest możliwe, aby wykonać następujące czynności, choć nie tak bardzo:

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