Bir görünüm tarafından yürütülen gerçek sorguyu alın


23

Belirli bir sorgu tarafından yürütülen SQL sorgusunu bulmam gerekiyor. Görünümler modülü görünümü yapılandırırken SQL'i gösterebilir ancak görünüşe göre sorgu her durumda çalıştırılan gerçek sorgu değildir .
Devel modülünün veritabanı sorgularını gösterebileceğinin farkındayım, ancak her sorguda ilişkili 'A' bağlantısını tıklamak dışında gerçek sorguları göstermenin bir yolu yok ve yüzlerce kişi var .

Görünümün yürüttüğü asıl sorguyu nasıl öğrenebilirim? Görünüm bir blok olarak görüntülenir.

Yanıtlar:


40

Sen kullanımı zorunda hook_views_pre_execute ve Devel kullanımını yüklü dpqSQL Dize görmek için:

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

Teşekkürler. Hook api sayfasında "Sorgu şimdi tamamen oluşturuldu, ancak henüz db_rewrite_sql aracılığıyla çalıştırılmadı" yazıyor. Bu, başka bir kancanın koşmadan önce sql'yi yeniden yazma şansı olduğu anlamına mı geliyor? Sonra her durumda gerçek sorguyu alamazdım.
jjei

2
pre_render muhtemelen en iyisidir, ancak çoğu durumda sorgunun çok farklı olacağından emin değilim.
Countzero

Aslında bazı durumlarda Görünümlerde bir hata olduğunu düşünüyorum, az önce drupal.org/node/1845772
Sean Bannister

1
$ view-> build_info ['query'] aynı sorgu gibi görünüyor Görünüş ayarlarında SQL Query çıktısını etkinleştirirseniz, Gösterim görüntüler.
Johnathan Elmore

Bu işe yaramaz. Örnek SELECT users.uid AS kullanıcı kimliği, users.created AS users_created, users.language AS users_language, users.mail AS users_mail, users.name AS users_name_user_entity_type, 'kullanici' AS field_data_field_first_name_user_ity_ame_ity_er_alite_ty_d {users} Kullanıcılar WHERE (((users.status <> '0') AND (users.created> 1441641600))) SİPARİŞ Kullanıcılar tarafından oluşturulan DESC LIMIT 20 OFFSET 0 Kullanıcı alanı olan ve uygun sonuçlar vermeyen "field_data_field_first_name_user_entity_type" var değişiklik olmadan.
Marko Blazekovic

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

2

Yamalara veya kancalara gerek yok.

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

Bunu çıktı olarak verir

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

Üzgünüm, ama çıktılarım farklı: 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

Bana yardımcı olabilir misiniz?
Leo

1
@Leo Bunu çalıştırmaya çalıştığınız görünüm hakkında neye daha fazla bilgiye ihtiyacım var. Çıktı, değiştirilmemiş kutudan ön sayfa görüntüsü içindir; Ön sayfa görünümünün konfigürasyonunu değiştirmiş gibisiniz, tabii ki SQL farklı olacak.
mikeytown2

Bana cevap verdiğin için teşekkür ederim, belki bir soru oluşturacağım ve bu cevabı spam göndermemek için aşağıdaki bağlantıyı ekleyeceğim
Leo


1

Lütfen bu yamayı deneyin:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.