2012-06-27 20 views
11

मेरे कोड को डीबग करने के लिए मैं निष्पादित स्पष्ट एसक्यूएल क्वेरी देखना चाहता हूं।मैं क्वेरी में पैरामीटर कैसे देखूं?

मैं createQueryBuilder साथ क्वेरी बनाते हैं, और सबसे स्पष्ट बात मैं हासिल का उपयोग कर कच्चे क्वेरी चल रहा है:

$qb->getQuery()->getSQL(); 

समस्या यह है कि मानकों के बजाय मैं धारकों (?) देखते हैं। मुझे वेब पर कुछ समाधान मिले लेकिन वे 1.3 और 1.4 के लिए हैं, सिम्फनी -2 के लिए कुछ नहीं।

विचार? धन्यवाद!

+3

दरअसल, आपका प्रश्न इस http://lackoverflow.com/q/2095394/795876 का डुप्लिकेट है। सिद्धांत तैयार कथन का उपयोग कर रहा है, इस प्रकार PHP पक्ष पर कभी भी "वास्तविक" SQL क्वेरी नहीं होती है और सिद्धांत इसे प्रदर्शित नहीं कर सकता है। हालांकि आप अपने डीबगिंग उद्देश्यों के लिए http://stackoverflow.com/a/10577703/795876 इस समाधान को पढ़ सकते हैं। – fsenart

+2

इसके अलावा, सिद्धांत 2 में SQLLogger वर्ग है: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/configuration.html#sql-logger-optional – manix

+0

** fsehat ** - इस समाधान की तरह दिखता है सिम्फनी 1.4 के लिए है, मैं पूरी परियोजना में नहीं मिला और न ही 'getSqlQuery' फ़ंक्शन और न ही' getFlattenedParams' (जो फ़ंक्शन मैं गायब हूं)। ** मैनिक्स ** - क्या आपके पास सिम्फनी 2.x में लॉगर का उपयोग करने के लिए अधिक दस्तावेज़ीकरण के लिए कुछ संदर्भ है? यह एक अच्छा समाधान की तरह दिखता है लेकिन मुझे कोई अच्छा दस्तावेज नहीं मिला है। ** दोनों के लिए धन्यवाद! ** – guyaloni

उत्तर

27

आप $query->getParameters() का उपयोग कर प्लेसहोल्डर द्वारा प्रयोग किया जाता मानकों तक पहुँच सकते हैं, ताकि आप अपने क्वेरी का उपयोग डिबग सकता है:

$query = $qb->getQuery(); 
print_r(array(
    'sql'  => $query->getSQL(), 
    'parameters' => $query->getParameters(), 
)); 
+2

असल में यह एक अच्छा विचार है।समस्या यह है कि पैरामीटर बैग में ऑब्जेक्ट हो सकते हैं, और उसके बाद इसे प्रिंट करने का प्रयास करने से बड़ी स्ट्रिंग मिलती है। मैं क्या करना चाहता हूं पैरामीटर बैग को कनवर्ट करना है जो '$ query-> getParameters() 'द्वारा स्ट्रिंग्स की सरणी में लौटाया जाता है जो प्लेसहोल्डर्स को बदल सकता है?'। – guyaloni

+2

मुझे लगता है कि यह सरणी स्केलर मानों की एक सरणी है, यदि आप सेट पैरामीटर विधि https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L202 देखते हैं, तो यह कॉल प्रक्रिया पैरामीटर वैल्यू जो सरणी और ऑब्जेक्ट्स को स्केलर मानों में बदलता है https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L227 – AdrienBrault

+0

मजेदार, मुझे मिला (जहां तक ​​मैं समझता हूं .. ।) सभी विक्रेताओं का अंतिम संस्करण, और मेरा 'AbstractQuery.php' और' Query.php' थोड़ा अलग है। शायद मेरे पास सिद्धांत 2.1 है जबकि यह कोड 2.2 है। वैसे भी, मैंने अपनी 'Query.php' फ़ाइल में एक विधि जोड़ा जो आपके उत्तरों के आधार पर कच्चे sql + पैरामीटर देता है। धन्यवाद! – guyaloni

2

आप आसानी से एसक्यूएल पैरामीटर निम्नलिखित दृष्टिकोण का उपयोग कर पहुँच सकते हैं।

$result = $qb->getQuery()->getSQL(); 

    $param_values = ''; 
    $col_names = ''; 

    foreach ($result->getParameters() as $index => $param){    
      $param_values .= $param->getValue().','; 
      $col_names .= $param->getName().','; 
    } 

    //echo rtrim($param_values,','); 
    //echo rtrim($col_names,',');  

तो अगर आप $param_values और $col_names बाहर मुद्रित, आप एसक्यूएल और संबंधित स्तंभ नाम के माध्यम से गुजर पैरामीटर मान प्राप्त कर सकते हैं।

नोट: यदि $param एक सरणी देता है, तो आपको फिर से पुन: प्रयास करने की आवश्यकता है, क्योंकि IN (:?) के अंदर पैरामीटर आमतौर पर एक नेस्टेड सरणी के रूप में आता है।

इस बीच यदि आप किसी अन्य दृष्टिकोण मिल गया है, हमारे साथ साझा करना तरह पर्याप्त हो तो कृपया :)

धन्यवाद!

0

मुझे क्वेरीब्यूल्डर के साथ पहले से निर्मित 5 क्वेरी के साथ एक आवश्यकता संघ (डीक्यूएल या क्वेरीबिल्डर के साथ असंभव) बनाना था। इसलिए मैं इन प्रश्नों का पुन: उपयोग करता हूं लेकिन मुझे GetParameters() फ़ंक्शन का उपयोग करने में कोई समस्या थी क्योंकि यह पैरामीटर को उसी क्रम में देता है जिसे आपने दिया है। जब आप क्वेरी बिल्डर का उपयोग करते हैं तो फायदे में से एक यह है कि आप yhou चाहते हैं तो एक क्वेरी बना सकते हैं लेकिन जब आप पैरामीटर पुनर्प्राप्त करते हैं, तो आप इसे गन्दा में पुनर्प्राप्त कर सकते हैं। इस से बचने के लिए मैं का निर्माण किया है निम्नलिखित समारोह:

$getSqlWithParams = \Closure::bind(function(){ 
     return [$this->getSql(), $this->processParameterMappings($this->_parserResult->getParameterMappings())]; 
    }, null, Query::class); 

अब जब आप एसक्यूएल और क्रमबद्ध मानकों को पुनः प्राप्त चाहते हैं आप करते हैं:

$getSqlWithParams()->call($query) 

उपयोग \ सिद्धांत \ ORM \ क्वेरी बयान मत भूलना । और voilà!

संबंधित मुद्दे