Dapatkan kueri aktual dieksekusi oleh tampilan

23

Saya perlu mencari tahu permintaan SQL yang dijalankan oleh permintaan tertentu. Modul Views dapat menampilkan SQL saat mengonfigurasi tampilan tetapi ternyata kueri bukan kueri aktual yang dijalankan dalam semua kasus .
Saya sadar bahwa modul Devel dapat menampilkan kueri basis data, tetapi tidak ada cara dengan devel untuk menampilkan kueri yang sebenarnya kecuali mengklik tautan 'A' yang terkait dengan setiap kueri dan ada ratusan .

Bagaimana saya bisa mengetahui kueri aktual yang dijalankan oleh tampilan? Tampilan ditampilkan sebagai blok.

jjei
sumber

Jawaban:

40

Anda harus menggunakan hook_views_pre_execute dan dengan Devel yang diinstal gunakan dpquntuk melihat String SQL:

function hook_views_pre_execute(&$view) {
  dpq($view->build_info['query']);
}
Countzero
sumber
Terima kasih. Bunyinya di halaman hook hook bahwa "Query sekarang sepenuhnya dibangun, tetapi belum dijalankan melalui db_rewrite_sql." Apakah ini berarti ada kemungkinan bahwa beberapa kait lain mungkin menulis ulang sql sebelum dijalankan? Maka saya tidak akan mendapatkan permintaan aktual dalam semua situasi.
jjei
2
pre_render mungkin yang terbaik, tapi saya tidak yakin permintaannya akan sangat jauh berbeda dalam banyak kasus.
Countzero
Saya sebenarnya berpikir ada bug di Views dalam beberapa kasus, saya baru saja memposting masalah drupal.org/node/1845772
Sean Bannister
1
$ view-> build_info ['query'] nampak seperti tampilan Views kueri yang sama jika Anda mengaktifkan output SQL Query dalam pengaturan Views.
Johnathan Elmore
Ini tidak berguna. Contoh 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_type, 'user' AS field_data_field_date_of_birth_user_entity_type DARI {users} users WHERE (((users.status <> '0') AND (users.created> 1441641600))) ORDER OLEH users_created DESC LIMIT 20 OFFSET 0 Saya punya "field_data_field_first_name_user_entity_type" yang merupakan bidang pengguna dan dalam tidak memberikan hasil yang tepat tanpa perubahan.
Marko Blazekovic
4
function hook_views_pre_execute(&$view) {
  if ($view->name == 'XYZ') {
    $query = (string)$view->build_info['query'];
    echo $query;
  }
}
Sandesh Manghale
sumber
2

Tidak perlu patch atau kait.

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

Memberikan ini sebagai output

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
sumber
Maaf, tetapi hasil saya berbeda: 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
Bisakah kamu membantuku?
Leo
1
@ Leo Saya perlu info lebih lanjut tentang pandangan Anda tentang bagaimana menjalankan ini. Outputnya adalah untuk tampilan halaman depan dari kotak tidak diubah; Kedengarannya seperti Anda telah mengubah konfigurasi tampilan halaman depan jadi tentu saja SQL akan berbeda.
mikeytown2
Terima kasih telah menjawab saya, mungkin saya akan membuat pertanyaan dan memasukkan tautan di bawah, agar tidak mengirim spam jawaban ini
Leo
tautan pertanyaan, saya harap saya jelas drupal.stackexchange.com/questions/270994/…
Leo
1

Silakan coba tambalan ini:

--- 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
sumber