2012-01-10 19 views
5

में REGEXP का उपयोग करके मैंने यह एक बहुत बड़ा सौदा किया है और मुझे यकीन है कि उत्तर नहीं है, लेकिन मुझे गलत साबित करना अच्छा लगेगा।सिद्धांत 2.x ORM

मैं डीक्यूएल में लिखी गई क्वेरी निष्पादित करना चाहता हूं जिसमें 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'); 

(मेरा असली regex अभिव्यक्ति अधिक जटिल है यह एक सरल regex है और मैं एक तरह के रूप में किया जा सकता है एहसास, लेकिन यह सिर्फ एक उदाहरण है): उदाहरण के लिए

मैंने सिद्धांत \ ORM \ क्वेरी \ Expr क्लास, साथ ही QueryBuilder क्लास में देखा है। मुझे REGEXP के लिए कोई समर्थन नहीं दिख रहा है। एसओ पर किसी के पास एक पोस्ट है जिसमें कहा गया है कि उन्होंने एक्सप्र क्लास का इस्तेमाल किया था, लेकिन यह वास्तव में काम नहीं करता है (उन्होंने कहा कि यह अनचाहे था)।

किसी भी विचार को डीईसीएल डब्ल्यू/आउट लेखन सीधे एसक्यूएल में REGEXP निष्पादित करने का तरीका है? टीआईए।

उत्तर

3

समस्या इतनी अधिक नहीं है कि क्वेरी बिल्डर MySQL में (गैर-मानक) REGEXP कार्यक्षमता के लिए क्वेरी नहीं बना सकता है, लेकिन यह भी कि यदि आप अपनी क्वेरी जेनरेट कर सकते हैं, तो ऐसा करने का कोई तरीका नहीं है कि DQL पार्सर इसे किए बिना समझ पाएगा इसके बारे में कुछ।

यह "कुछ" नियमित अभिव्यक्ति वाक्यविन्यास को समझने के लिए सिद्धांत के डीक्यूएल को विस्तारित कर रहा है। यह in a blog post वर्णित डीक्यूएल को विस्तारित करने योग्य है।

अधिक जानकारी के लिए MySQL part of DoctrineExtensions

+0

ब्लॉगपोस्ट पर बुरा लिंक , क्या यह अब अद्यतित नहीं है (सिद्धांत 1)? –

+1

@ पीटररोडरलंड तय –

+0

ध्यान देने योग्य एक बात: आपको REGEXP के अंत में एक तुलना ऑपरेटर जोड़ना होगा या अन्यथा इसे वापस लाएगा। सिद्धांत के लिए जहां सभी खंडों को तुलना ऑपरेटर होना आवश्यक है, भले ही REGEXP को इसकी आवश्यकता न हो – Patrick

1

का कोड आप पल के लिए Doctrine2 साथ ऐसा नहीं कर सकते अध्ययन करते हैं। आप कस्टम फ़ंक्शन जोड़ सकते हैं, लेकिन REGEXP फ़ंक्शन नहीं है, लेकिन एक तुलना ऑपरेटर है। अभी तक Doctrine2 में सीमा शुल्क तुलना ऑपरेटरों के लिए कोई समर्थन नहीं है। इस मंच धागा पर

देखो: https://groups.google.com/group/doctrine-user/browse_thread/thread/b98e37fc296c8183/06782192719156c6?lnk=gst&q=regexp#06782192719156c6

आप मूल निवासी एसक्यूएल उपयोग करना चाहिए: http://www.doctrine-project.org/docs/orm/2.1/en/reference/native-sql.html

0

तो निम्न कार्य के लिए संभव है, हालांकि के रूप में सुंदर नहीं:

$builder->add('select', 'a.fileName') 
     ->add('from', '\Company\Bundle\Entity\Asset a') 
     ->add('where', 'a.someField REGEXP '.$someRegex); 
संबंधित मुद्दे