Uzyskaj rzeczywiste zapytanie wykonane przez widok


23

Muszę znaleźć zapytanie SQL, które jest wykonywane przez określone zapytanie. Moduł Widoki może pokazywać SQL podczas konfigurowania widoku, ale najwyraźniej zapytanie nie jest rzeczywistym zapytaniem, które jest uruchamiane we wszystkich przypadkach .
Wiem, że moduł Devel może wyświetlać zapytania do bazy danych, ale devel nie ma możliwości pokazania rzeczywistych zapytań, z wyjątkiem klikania powiązanego linku „A” z każdym zapytaniem i są ich setki .

Jak mogę znaleźć rzeczywiste zapytanie, które wykonuje widok? Widok jest wyświetlany jako blok.

Odpowiedzi:


40

Musisz użyć hook_views_pre_execute, a przy zainstalowanym Devel użyj, dpqaby wyświetlić ciąg SQL:

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

Dzięki. Na stronie interfejsu API hooka czytamy: „Zapytanie jest teraz w pełni zbudowane, ale nie zostało jeszcze uruchomione przez db_rewrite_sql”. Czy to oznacza, że ​​istnieje szansa, że ​​jakiś inny hak może przepisać sql przed jego uruchomieniem? Wtedy nie otrzymam rzeczywistego zapytania we wszystkich sytuacjach.
jjei

2
pre_render jest prawdopodobnie najlepszy, ale nie jestem pewien, czy zapytanie będzie bardzo różne w większości przypadków.
Countzero


1
$ view-> build_info ['zapytanie'] wydaje się być tym samym zapytaniem Wyświetlane widoki, jeśli włączysz dane wyjściowe zapytania SQL w ustawieniach Widoku.
Johnathan Elmore

To jest bezużyteczne. Przykład SELECT users.uid CO UID users.created CO users_created, users.language CO users_language, users.mail AS users_mail, users.name AS USERS_NAME 'użytkownik' CO field_data_field_first_name_user_entity_type 'użytkownik' CO field_data_field_last_name_user_entity_type 'użytkownik' CO field_data_field_date_of_birth_user_entity_type OD {users} users WHERE (((users.status <> '0') AND (users.created> 1441641600))) ZAMÓWIENIE BY users_created DESC LIMIT 20 OFFSET 0 Mam "field_data_field_first_name_user_entity_type", który jest polem użytkownika i nie daje poprawnych wyników bez zmian.
Marko Blazekovic

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

2

Nie potrzeba łat ani haczyków.

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

Daje to jako wynik

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

Przepraszam, ale moje wyniki są inne: 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

możesz mi pomóc?
Lew

1
@ Leo Potrzebuję więcej informacji na temat tego, w jaki sposób próbujesz to uruchomić. Dane wyjściowe są niezmienione dla widoku pierwszej strony; wygląda na to, że zmieniłeś konfigurację widoku pierwszej strony, więc oczywiście SQL będzie inny.
mikeytown2

Dziękuję za odpowiedź, może utworzę pytanie i wstawię poniższy link, aby nie spamować tej odpowiedzi
Leo

link do pytania, mam nadzieję, że było jasne drupal.stackexchange.com/questions/270994/…
Leo

1

Wypróbuj tę poprawkę:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.