दृश्य द्वारा निष्पादित वास्तविक क्वेरी प्राप्त करें


23

मुझे एक निश्चित क्वेरी द्वारा निष्पादित SQL क्वेरी का पता लगाने की आवश्यकता है। व्यू मॉड्यूल कॉन्फ़िगर करते समय एसक्यूएल दिखा सकता है लेकिन जाहिर है कि क्वेरी वास्तविक क्वेरी नहीं है जो सभी मामलों में चलती है
मुझे पता है कि देवल मॉड्यूल डेटाबेस प्रश्नों को दिखा सकता है, लेकिन हर क्वेरी के साथ संबद्ध 'ए' लिंक पर क्लिक करने के अलावा वास्तविक प्रश्नों को दिखाने का कोई तरीका नहीं है

मैं उस वास्तविक क्वेरी का पता कैसे लगा सकता हूं जिसे दृश्य निष्पादित करता है? दृश्य को एक ब्लॉक के रूप में प्रदर्शित किया जाता है।

जवाबों:


40

आपको एसक्यूएल स्ट्रिंग देखने के लिए हुक_व्यूस_एक्सपेक्ट्यूट और डेवेल स्थापित उपयोग के साथ उपयोग dpqकरना होगा:

function hook_views_pre_execute(&$view) {
  dpq($view->build_info['query']);
}

धन्यवाद। यह हुक एपीआई पेज में पढ़ता है कि "क्वेरी अब पूरी तरह से निर्मित है, लेकिन इसे अभी तक db_rewrite_sql के माध्यम से नहीं चलाया गया है।" क्या इसका मतलब यह है कि एक मौका है कि कुछ अन्य हुक अपने चलाने से पहले एसक्यूएल को फिर से लिख सकते हैं? तब मुझे सभी स्थितियों में वास्तविक क्वेरी नहीं मिलेगी।
jjei

2
pre_render शायद सबसे अच्छा है, लेकिन मुझे यकीन नहीं है कि अधिकांश मामलों में क्वेरी बहुत अलग होगी।
काउंट्ज़ेरो

मुझे वास्तव में लगता है कि कुछ मामलों में दृश्य में एक बग है, मैंने सिर्फ एक मुद्दा drupal.org/node/1845772
सीन बैनिस्टर

1
$ दृश्य-> build_info ['क्वेरी'] यदि आप दृश्य सेटिंग में SQL क्वेरी आउटपुट को सक्षम करते हैं, तो वही क्वेरी दृश्य प्रदर्शित होता है।
जॉनाथन एलमोर

यह बेकार है। उदाहरण SELECT users.uid AS uid, users.created AS users_created, users.language AS users_language, users.mail AS users_mail, users.name AS users_name, 'user' AS फ़ील्ड_Data_field_first_name_user_entity_type, 'user' ASland_data_data.adata.adata.adata.adata.adata/data_data_data_data&hl=hi उपयोगकर्ता परिवर्तन के बिना।
मार्को ब्लाजाकोविक


2

पैच या हुक की कोई आवश्यकता नहीं है।

// Run the view.
$view = views_get_view('frontpage');
$view->set_display('page');
$view->pre_execute();
$view->execute();

/* Magic Below Here */
// Get query from the view.
$query = $view->query->query();

// Format SelectQueryInterface into a string.
$string = (string) $query;

// Replace arguments.
$arguments = $query->arguments();
if (!empty($arguments) && is_array($arguments)) {
  foreach ($arguments as $placeholder => &$value) {
    if (is_string($value)) {
      $value = "'$value'";
    }
  }
  $string = strtr($string, $arguments);
}

// Format the query string for more readable output.
$string = str_replace(array(' {', "\n{"), ' ', $string);
$string = str_replace(array('} ', "}\n"), ' AS ', $string);
$string = str_replace(', ', ",\n  ", $string);
$string = str_replace(' AND ', "\n  AND ", $string);
$string = str_replace(' ON ', "\n  ON ", $string);
$string = str_replace('SELECT ', "SELECT\n  ", $string);
$string = str_replace('ORDER BY ', "ORDER BY\n  ", $string);

// echo $string;
echo str_replace('  ', '  ', nl2br($string));

इसे आउटपुट के रूप में देता है

SELECT
  node.sticky AS node_sticky,
  node.created AS node_created,
  node.nid AS nid,
  'frontpage:page' AS view_name
FROM  node AS node
WHERE (( (node.promote <> 0)
  AND (node.status = 1) ))
ORDER BY
  node_sticky DESC,
  node_created DESC
LIMIT 10 OFFSET 0

मुझे क्षमा करें, लेकिन मेरा आउटपुट अलग है: SELECT node.nid AS nid, 'node' AS field_data_field_name_node_entity_type, 'node' AS field_data_field_surname_node_entity_type, ecc ...
लियो

क्या आप मेरी मदद कर सकते हैं?
सिंह

1
@ मुझे इस बारे में अधिक जानकारी की आवश्यकता है कि इसे चलाने के लिए आपकी क्या कोशिश है। आउटपुट सामने वाले दृश्य के लिए है जो बॉक्स से बाहर है; लगता है जैसे आपने फ्रंटपेज व्यू के कॉन्फ़िगरेशन को बदल दिया है, निश्चित रूप से एसक्यूएल अलग होगा।
mikeytown2

मुझे जवाब देने के लिए धन्यवाद, शायद मैं एक सवाल बनाऊंगा और नीचे दिए गए लिंक को डालूंगा, इस जवाब को स्पैम न करने के लिए
लियो

प्रश्न का लिंक, मुझे आशा है कि मैं स्पष्ट drupal.stackexchange.com/questions/270994/…
लियो

1

कृपया इस पैच को आज़माएँ:

--- a/sites/all/modules/views/plugins/views_plugin_query_default.inc
+++ b/sites/all/modules/views/plugins/views_plugin_query_default.inc
@@ -1393,6 +1393,19 @@ class views_plugin_query_default extends     views_plugin_query {
           $query->range($offset, $limit);
         }

+        $query_string = (string)$query;
+        $query_string = str_replace('{', '', $query_string);
+        $query_string = str_replace('}', '', $query_string);
+        $query_params = $query->getArguments();
+        foreach($query_params as $placeholder => $value) {
+          if(!is_numeric($value)) {
+            $query_string = str_replace($placeholder, "'$value'",    $query_string);
+          }
+          else {
+            $query_string = str_replace($placeholder, $value, $query_string);
+          }
+        }
+        drupal_set_message($query_string);
         $result = $query->execute();

         $view->result = array();

0

// यहाँ देखें नाम और प्रासंगिक फ़िल्टर द्वारा परिणाम प्राप्त करें

    $viewr = views_get_view('top_block_on_product_display');
    $args[] = $myarg;
    $display_id = 'default';
    $viewr->set_arguments($args);
    $viewr->set_display($display_id);
    $viewr->execute();
    $view_content = $viewr->result;

अधिक संदर्भ के लिए डॉक्टर देखें: https://api.drupal.org/api/views/views.module/function/views_get_view_result/7.x-3.x

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.