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


23

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 en a des centaines .

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

Réponses:


40

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

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

Merci. Il lit dans la page de l'API du crochet que "La requête est maintenant entièrement construite, mais elle n'a pas encore été exécutée via db_rewrite_sql." Cela signifie-t-il qu'il existe un risque qu'un autre crochet réécrive le sql avant son exécution? Ensuite, je n'obtiendrais pas la requête réelle dans toutes les situations.
jjei

2
pre_render est probablement le meilleur, mais je ne suis pas sûr que la requête sera très différente dans la plupart des cas.
Countzero

En fait, je pense qu'il y a un bug dans Views dans certains cas, je viens de publier un problème drupal.org/node/1845772
Sean Bannister

1
$ view-> build_info ['query'] semble être la même requête que Views affiche si vous activez la sortie SQL Query dans les paramètres de Views.
Johnathan Elmore

C'est inutile. Exemple SELECT user.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 field_data_field_first_name_user_entity_type, 'user' AS field_data_field_last_name_user_entity_type_type_user_f_ {users} users WHERE ((((users.status <> '0') AND (users.created> 1441641600))) ORDER BY users_created DESC LIMIT 20 OFFSET 0 J'ai "field_data_field_first_name_user_entity_type" qui est un champ utilisateur et qui ne donne pas de bons résultats sans modifications.
Marko Blazekovic

4
function hook_views_pre_execute(&$view) {
  if ($view->name == 'XYZ') {
    $query = (string)$view->build_info['query'];
    echo $query;
  }
}

2

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('  ', '&nbsp;&nbsp;', 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

Je suis désolé, mais ma sortie est différente: SELECT node.nid AS nid, 'node' AS field_data_field_name_node_entity_type, 'node' AS field_data_field_surname_node_entity_type, ecc ...
Leo

Pouvez-vous m'aider?
Leo

1
@Leo J'ai besoin de plus d'informations sur la vue que vous essayez d'exécuter. La sortie est inchangée pour la vue de la première page de la boîte; sonne comme si vous avez changé la configuration de la vue de la première page, donc bien sûr le SQL sera différent.
mikeytown2

Merci de m'avoir répondu, je vais peut-être créer une question et insérer le lien ci-dessous, afin de ne pas spammer cette réponse
Leo

le lien de la question, j'espère avoir été clair drupal.stackexchange.com/questions/270994/…
Leo

1

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.