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.

Jjei
źródło

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']);
}
Countzero
źródło
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
Wydaje
Sean Bannister
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;
  }
}
Sandesh Manghale
źródło
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
mikeytown2
źródło
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();
Junaid
źródło