Nhận truy vấn thực tế được thực hiện bởi một khung nhìn


23

Tôi cần tìm ra truy vấn SQL được thực hiện bởi một truy vấn nhất định. Mô-đun khung nhìn có thể hiển thị SQL khi định cấu hình khung nhìn nhưng rõ ràng truy vấn không phải là truy vấn thực tế được chạy trong mọi trường hợp .
Tôi biết rằng mô-đun Devel có thể hiển thị các truy vấn cơ sở dữ liệu, nhưng không có cách nào để phát hiện các truy vấn thực tế ngoại trừ nhấp vào liên kết 'A' được liên kết với mỗi truy vấn và có hàng trăm trong số chúng .

Làm cách nào tôi có thể tìm ra truy vấn thực tế mà chế độ xem thực thi? Khung nhìn được hiển thị dưới dạng một khối.

Câu trả lời:


40

Bạn phải sử dụng hook_view_pre_execute và với Devel được cài đặt sử dụng dpqđể xem Chuỗi SQL:

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

Cảm ơn. Nó đọc trong trang hook api rằng "Truy vấn hiện đã được xây dựng hoàn chỉnh, nhưng nó chưa được chạy qua db_rewrite_sql." Điều này có nghĩa là có khả năng một số hook khác có thể viết lại sql trước khi chạy? Sau đó, tôi sẽ không nhận được truy vấn thực tế trong tất cả các tình huống.
jjei

2
pre_Vnder có lẽ là tốt nhất, nhưng tôi không chắc truy vấn sẽ khác rất nhiều trong hầu hết các trường hợp.
Countzero

Tôi thực sự nghĩ rằng có một lỗi trong Lượt xem trong một số trường hợp, tôi vừa đăng một vấn đề drupal.org/node/1845772
Sean Bannister

1
$ view-> build_info ['query'] dường như là cùng một truy vấn Lượt xem hiển thị nếu bạn bật đầu ra Truy vấn SQL trong cài đặt Chế độ xem.
Johnathan Elmore

Điều này là vô ích. Ví dụ CHỌN người dùng.uid AS uid, users.created AS users_created, users.lingu {users} người dùng WHERE (((users.status <> '0') VÀ (users.created> 1441641600))) ĐẶT HÀNG theo người dùng_created DESC LIMIT 20 OFFSET 0 Tôi có "field_data_field_first_name_user_entity_type_" không thay đổi.
Marko Blazekovic

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

2

Không cần phải vá hoặc móc.

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

Cung cấp điều này như đầu ra

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

Tôi xin lỗi, nhưng đầu ra của tôi thì khác: 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

Bạn có thể giúp tôi được không?
Leo

1
@Leo Tôi cần thêm thông tin về quan điểm của bạn khi cố gắng chạy cái này. Đầu ra dành cho chế độ xem frontpage ra khỏi hộp không thay đổi; Có vẻ như bạn đã thay đổi cấu hình của giao diện trang trước nên dĩ nhiên SQL sẽ khác.
mikeytown2

Cảm ơn bạn đã trả lời tôi, có thể tôi sẽ tạo một câu hỏi và chèn liên kết bên dưới, để không spam câu trả lời này
Leo

liên kết của câu hỏi, tôi hy vọng tôi đã rõ ràng drupal.stackexchange.com/questions/270994/...
Leo

1

Vui lòng thử bản vá này:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.