डीबग EntityFieldQuery?


27

मेरे पास एक मॉड्यूल है जो दुर्व्यवहार कर रहा है। एक EFQ अप्रत्याशित परिणाम प्राप्त कर रहा है, लेकिन मैं यह नहीं देख सकता कि सिर्फ कोड को देखकर क्यों । क्या EFQ के लिए एक dpq () बराबर है? उन्हें डिबग करने के अन्य तरीके?


इसी तरह के सवाल: drupal.stackexchange.com/questions/33473/… । क्या आप यह देखने के लिए एक स्ट्रिंग को क्वेरी ऑब्जेक्ट डाल सकते हैं कि एसक्यूएल कोई सुराग दे?
क्लाइव

1
महान सुझाव, हालांकि: पुनर्प्राप्त करने योग्य घातक त्रुटि: कक्षा EntityFieldQuery का उद्देश्य स्ट्रिंग में परिवर्तित नहीं किया जा सकता है :(
सुस्ती

जवाबों:


36

यह एक हैक का एक छोटा सा है, लेकिन आप EntityFieldQueryक्वेरी के लिए मुद्रण करने में रुचि रखने वाले किसी भी व्यक्ति के लिए एक टैग जोड़ सकते हैं , फिर hook_query_alter()इसे तब लागू करने के लिए इसे रोक सकते हैं जब यह एक मानक हो SelectQuery, फिर इसे डीबगिंग के लिए स्ट्रिंग में डाल दें:

function MYMODULE_query_alter($query) {
  if ($query->hasTag('efq_debug')) {
    dpm((string)$query);
  }
}

$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node')
  ->addTag('efq_debug')
  ->execute();

यह थोड़ा हैक है लेकिन ट्रिक करता है। उपरोक्त के लिए आउटपुट है:

SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle, :entity_type     
AS entity_type
FROM {node} node

संभवत: यह केवल MySQL को फील्ड स्टोरेज सिस्टम के रूप में उपयोग करने पर भी काम करेगा।


सिद्धांत में बहुत अच्छा लगता है, लेकिन सवाल पर टिप्पणियों के बारे में क्या? EFQ __toString () को लागू नहीं करता है?
लेथियन जूल

4
जब तक यह hook_query_alter()क्वेरी के लिए हो जाता है तब तक EntityFieldQueryकोई अधिक नहीं होता है, इसे एक मानक के रूप में परिवर्तित किया जाता है db_select(), इसलिए __tostring()महान काम करता है :) क्योंकि इसे बाहर काम करने के बाद मैं इसे काफी उपयोग कर रहा हूं और यह बहुत अच्छी तरह से काम करता है
क्लाइव

इस बात की पुष्टि की जाती है कि क्वेरी मिलते ही स्ट्रिंग कास्ट करने का काम करता है hook_query_alter()
21

उपर्युक्त उदाहरण में क्वेरी बहसोस (": unit_type") देखने के लिए आप dpm ($ क्वेरी-> तर्क ()) का उपयोग कर सकते हैं;
sanzante

13

अपने स्वयं के हुक_क्लेरी_ल्टर () को रोल करने के बजाय आप देवल मॉड्यूल को debugटैग जोड़कर आपके लिए भारी उठाने दे सकते हैं :

$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
  ->addTag('debug')
  ->execute();

यह क्वेरी को स्क्रीन पर प्रिंट करेगा, जैसे dpq()होगा।


4

@Clive उत्तर को जोड़ना, जो आम तौर पर प्लेसहोल्डर के साथ क्वेरी को प्रिंट करता है और मूल्य के साथ नहीं। क्वेरी के साथ मान को प्रिंट करने के लिए हुक_क्वेरी_ल्टर के तहत निम्न कोड का उपयोग करें।

function hook_query_alter($query) {
  if ($query->hasTag('debug')) {
    $sql = (string)$query;
    $connection = Database::getConnection();
    foreach ((array) $query->arguments() as $key => $val) {
      $quoted[$key] = $connection->quote($val);
    }
    $sql = strtr($sql, $quoted);
    dpm($sql);
  }
}


$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
  ->addTag('debug');
  ->execute();

कोड की कुछ पंक्तियों के लिए मॉड्यूल स्थापित करना अच्छा अभ्यास नहीं है। यही कारण है कि मैंने उपरोक्त समाधान का विकल्प चुना।


2

यदि आप नाइस DPQ (या कुछ भी => 1.1) के देव संस्करण को डाउनलोड करते हैं , तो आप बस यह कर सकते हैं:

$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();

और आपको क्वेरी dpm'ed अच्छी तरह से मिल जाएगी :)। ऊपर दिए गए कोड में महत्वपूर्ण हिस्सा addTag ('nicedpq') है - जो ट्रिगर करता है dpm()


अच्छा वैकल्पिक वैकल्पिक हल करने के लिए। डीओ पर सीधे उस मॉड्यूल को नहीं खोजा जा सकता क्योंकि उन्होंने संबंधित मॉड्यूल ब्लॉक को हटा दिया था जो कि इयरलीयर था।
किरकिंग

1

आप इसे XDebug के माध्यम से डीबग करने का प्रयास कर सकते हैं । एक बार स्थापित xdebug_start_trace()होने के xdebug_stop_trace()बाद , कोड से पहले करें, और उसके बाद, फिर आपके पास स्पष्ट ट्रेस लॉग होगा जिसे निष्पादित किया गया था और जहां।

इसके अलावा आप MySQL कॉन्फ़िगरेशन में क्वेरी लकड़हारा सक्षम कर सकते हैं।

दूसरी विधि डिबगर्स की तरह स्ट्रेस / ट्रस / डट्रस का उपयोग करना है।

Dtruss का उपयोग करके उदाहरण:

  • सभी प्रश्न

    sudo dtruss -t read -n mysqld
  • विशिष्ट प्रश्न

    sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT

ध्यान दें कि dtrussसिर्फ एक स्क्रिप्ट है जो DTrace का उपयोग करती है, इसलिए आप अपनी स्क्रिप्ट लिखकर PHP DTrace static probes या DTracing MySQL के प्रत्यक्ष कार्यान्वयन पर विचार कर सकते हैं ।

और पढ़ें: कमांड लाइन (स्ट्रेस और tcpdump) का उपयोग करके ड्रुपल कोर का उन्नत डिबगिंग


0

इस फ़ंक्शन को अपने मॉड्यूल में जोड़ें। फिर, टैग debugको किसी भी EFQ में जोड़ें । क्वेरी मुद्रित करने के लिए डेवेल मॉड्यूल को सक्षम करने की आवश्यकता होती है।

/**
 * Implements hook_query_TAG_alter().
 *
 * Add the tag 'debug' to any EFQ and this will print the query to the messages.
 *
 * @param \QueryAlterableInterface $query
 */
function MYMODULE_query_debug_alter(QueryAlterableInterface $query) {
  if (function_exists('dpq') && !$query->hasTag('debug-semaphore')) {
    $query->addTag('debug-semaphore');
    dpq($query);
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.