web-dev-qa-db-fra.com

Obtenez la requête réelle exécutée par une vue

J'ai besoin de découvrir la requête SQL qui est exécutée par une certaine requête. Le module Vues peut afficher le SQL lors de la configuration de la vue mais apparemment la requête n'est pas la requête réelle qui est exécutée dans tous les cas .
Je suis conscient que le module Devel peut afficher les requêtes de base de données, mais il n'y a aucun moyen avec devel d'afficher les requêtes réelles sauf en cliquant sur le lien 'A' associé à chaque requête et il y a des centaines de eux .

Comment puis-je trouver la requête réelle que la vue exécute? La vue est affichée sous forme de bloc.

22
jjei

Vous devez utiliser hook_views_pre_execute et avec Devel installé utiliser dpq pour afficher la chaîne SQL:

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

Pas besoin de patchs ou de crochets.

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

Donne cela en sortie

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
3
mikeytown2
function hook_views_pre_execute(&$view) {
  if ($view->name == 'XYZ') {
    $query = (string)$view->build_info['query'];
    echo $query;
  }
}
3
Sandesh Manghale

Veuillez essayer ce patch:

--- 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();
1
Junaid

// Obtenez les résultats par nom de vue et filtre contextuel nid ici

    $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;

Voir le doc pour plus de référence: https://api.drupal.org/api/views/views.module/function/views_get_view_result/7.x-3.x

0
Sameer Choudhary