Die aktuelle Abfrage von einer Ansicht ausführen lassen


23

Ich muss die SQL-Abfrage herausfinden, die von einer bestimmten Abfrage ausgeführt wird. Das Ansichtsmodul kann die SQL beim Konfigurieren der Ansicht anzeigen, aber anscheinend ist die Abfrage nicht die tatsächliche Abfrage, die in allen Fällen ausgeführt wird .
Ich bin mir bewusst, dass das Devel-Modul die Datenbankabfragen anzeigen kann, aber es gibt keine Möglichkeit, mit Devel die tatsächlichen Abfragen anzuzeigen, es sei denn, Sie klicken bei jeder Abfrage auf den zugehörigen A-Link, und es gibt Hunderte davon .

Wie kann ich die tatsächliche Abfrage ermitteln, die die Ansicht ausführt? Die Ansicht wird als Block angezeigt.

Antworten:


40

Sie müssen hook_views_pre_execute verwenden und bei installiertem Devel use dpq, um die SQL- Zeichenfolge anzuzeigen :

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

Vielen Dank. Auf der Hook-API-Seite steht: "Die Abfrage ist jetzt vollständig erstellt, wurde jedoch noch nicht über db_rewrite_sql ausgeführt." Bedeutet dies, dass es eine Chance gibt, dass ein anderer Hook den SQL-Code vor seiner Ausführung neu schreibt? Dann würde ich die eigentliche Abfrage nicht in allen Situationen bekommen.
Jjei

2
pre_render ist wahrscheinlich die beste, aber ich bin mir nicht sicher, ob die Abfrage in den meisten Fällen sehr unterschiedlich sein wird.
Countzero

Ich glaube tatsächlich, dass es in einigen Fällen einen Fehler in Views gibt. Ich habe gerade ein Problem veröffentlicht. Drupal.org/node/1845772
Sean Bannister

1
$ view-> build_info ['query'] scheint dieselbe Abfrage zu sein, die Views anzeigt, wenn Sie die SQL Query-Ausgabe in den Views-Einstellungen aktivieren.
Johnathan Elmore

Das ist sinnlos. Beispiel 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 field_data_field_first_name_user_entity_type, 'user' AS field_data_field_last_name_user_entity 'user_type {users} users WHERE (((users.status <> '0') AND (users.created> 1441641600))) ORDER BY users_created DESC LIMIT 20 OFFSET 0 Ich habe "field_data_field_first_name_user_entity_type", das ein Benutzerfeld ist und keine richtigen Ergebnisse liefert ohne Änderungen.
Marko Blazekovic

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

2

Keine Notwendigkeit für Patches oder Haken.

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

Gibt dies als Ausgabe aus

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

Es tut mir leid, aber meine Ausgabe ist anders: 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

können Sie mir helfen?
Leo

1
@Leo Ich benötige weitere Informationen zu der Ansicht, auf der Sie dies ausführen möchten. Die Ausgabe ist unverändert für die Frontpage-Ansicht. Es hört sich so an, als ob Sie die Konfiguration der Frontpage-Ansicht geändert haben, sodass SQL natürlich anders sein wird.
Mikeytown2

Vielen Dank, dass Sie mir geantwortet haben. Vielleicht erstelle ich eine Frage und füge den folgenden Link ein, um diese Antwort nicht zu spammen
Leo,

der Link der Frage, ich hoffe, ich war klar drupal.stackexchange.com/questions/270994/…
Leo

1

Bitte versuchen Sie diesen 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();

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.