รับแบบสอบถามจริงที่ดำเนินการโดยมุมมอง


23

ฉันต้องการค้นหาแบบสอบถาม SQL ที่ดำเนินการโดยแบบสอบถามบางอย่าง โมดูลชมสามารถแสดง SQL เมื่อกำหนดค่ามุมมอง แต่เห็นได้ชัดแบบสอบถามไม่แบบสอบถามที่เกิดขึ้นจริงที่ได้รับการเรียกใช้ในทุกกรณี
ฉันทราบว่าโมดูล Devel สามารถแสดงคิวรีฐานข้อมูล แต่ไม่มีวิธีใดที่ Devel จะแสดงคิวรีที่แท้จริงยกเว้นการคลิกลิงก์ 'A' ที่เชื่อมโยงกับทุกแบบสอบถามและมีหลายร้อยรายการ

ฉันจะค้นหาคำค้นหาจริงที่มุมมองดำเนินการได้อย่างไร มุมมองจะแสดงเป็นบล็อก

คำตอบ:


40

คุณต้องใช้hook_views_pre_executeและใช้การติดตั้ง Devel dpqเพื่อดูสตริง SQL:

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

ขอบคุณ มันอ่านในหน้า hook api ว่า "แบบสอบถามตอนนี้สร้างเสร็จแล้ว แต่ยังไม่ได้เรียกใช้ผ่าน db_rewrite_sql" นี่หมายความว่ามีโอกาสที่ตะขออื่น ๆ อาจเขียน sql ใหม่ก่อนที่จะรันหรือไม่ จากนั้นฉันจะไม่ได้รับแบบสอบถามจริงในทุกสถานการณ์
jjei

2
pre_renderน่าจะดีที่สุด แต่ฉันไม่แน่ใจว่าคำค้นหาจะแตกต่างกันมากในกรณีส่วนใหญ่
Countzero

จริง ๆ แล้วฉันคิดว่ามีข้อผิดพลาดใน Views ในบางกรณีฉันเพิ่งโพสต์ปัญหาdrupal.org/node/1845772
Sean Bannister

1
$ view-> build_info ['query'] ดูเหมือนจะเป็น Views การค้นหาเดียวกันหากคุณเปิดใช้งานเอาต์พุต SQL Query ในการตั้งค่า Views
Johnathan Elmore

นี่มันไร้ประโยชน์ ตัวอย่าง SELECT users.uid AS uid, users.created AS users_created, users.language AS users_language, users.mail AS user_mail, user.mail_type_type_ity_type_type_type_user_first_name_user_entity_type, 'user' {users} ผู้ใช้ WHERE (((users.status <> '0') และ (users.created> 1441641600))) ORDER BY users_created DESC LIMIT 20 OFFSET 0 ฉันมี "field_data_field_first_name_user_ent__type" ซึ่งเป็นฟิลด์ผู้ใช้และไม่ให้ผลลัพธ์ที่เหมาะสม โดยไม่มีการดัดแปลง
Marko Blazekovic


2

ไม่ต้องใช้ปะหรือตะขอ

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

ให้สิ่งนี้เป็นเอาต์พุต

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

ฉันขอโทษ แต่การส่งออกของฉันคือแตกต่างกัน: 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

1
@Leo ฉันต้องการข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณเห็นในการลองใช้งาน เอาท์พุทสำหรับมุมมองด้านหน้าจากกล่องไม่เปลี่ยนแปลง; ดูเหมือนว่าคุณได้เปลี่ยนการกำหนดค่าของมุมมองหน้า Frontpage ดังนั้น SQL จะแตกต่างกัน
mikeytown2

ขอบคุณที่ตอบคำถามฉันอาจจะสร้างคำถามและใส่ลิงค์ด้านล่างเพื่อไม่ให้สแปมคำตอบนี้
Leo

ลิงก์ของคำถามฉันหวังว่าฉันจะชัดเจนdrupal.stackexchange.com/questions/270994/…
Leo

1

โปรดลองใช้โปรแกรมปะแก้นี้:

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

0

// รับผลลัพธ์โดยดูชื่อและตัวกรองบริบท nid ที่นี่

    $viewr = views_get_view('top_block_on_product_display');
    $args[] = $myarg;
    $display_id = 'default';
    $viewr->set_arguments($args);
    $viewr->set_display($display_id);
    $viewr->execute();
    $view_content = $viewr->result;

ดูเอกสารอ้างอิงเพิ่มเติมได้ที่: https://api.drupal.org/api/views/views.module/function/views_get_view_result/7.x-3.x

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.