2012-01-10 59 views
5

我已經研究了很多,我確定答案是否定的,但我很樂意證明錯誤。在Doctrine 2.x中使用REGEXP ORM

我想執行包含REGEXP操作的DQL編寫的查詢。例如:

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

(這是一個簡單的正則表達式,我意識到可以做的喜歡,但它只是一個例子 - 我真正的正則表達式的表達更復雜)

我查看了Doctrine \ ORM \ Query \ Expr類以及QueryBuilder類。我看不到REGEXP的支持。有人在SO上有一篇文章說他們使用Expr類,但這實際上並不奏效(他們表示這是未經測試的)。

任何想法如何在DQL中執行REGEXP w/out直寫SQL? TIA。

回答

3

問題不在於Query Builder無法爲MySQL中的(非標準)REGEXP功能創建查詢,而是更多的是即使您可以生成查詢,DQL解析器也無法在沒有做到的情況下理解它關於它的一些事。

「某些東西」正在擴展Doctrine的DQL以理解正則表達式的語法。這可以通過如in a blog post所述的擴展DQL來實現。

欲瞭解更多信息研究的MySQL part of DoctrineExtensions

+0

在博客帖子壞鏈接,它不再是最新的(doctrine1)嗎? – 2014-08-20 12:19:19

+1

@PetterSoderlund fixed – 2014-08-24 10:28:00

+0

有一點需要注意:您必須在REGEXP的末尾添加一個比較運算符,否則Doctrine會反彈回來。即使REGEXP不需要,Doctrine也要求所有where子句都有比較運算符 – Patrick 2015-06-25 18:02:09

0

這是可能做到以下幾點,雖然不漂亮:

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