Отримайте фактичний запит, виконаний переглядом


23

Мені потрібно з’ясувати запит SQL, який виконується певним запитом. Перегляди модуль може показати SQL при налаштуванні думки , але , по- видимому , клопотання не фактичний запит , який отримує працювати у всіх випадках .
Я знаю, що модуль Devel може відображати запити до бази даних, але немає можливості з devel показувати фактичні запити, за винятком натискання на пов'язане посилання "A" з кожним запитом, і їх сотні .

Як я можу дізнатися власне запит, який виконує представлення даних? Вид відображається як блок.

Відповіді:


40

Для перегляду рядка SQL ви повинні використовувати гачку_види_пре_execute та з встановленою Devel dpq:

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

Спасибі. У ньому йдеться на сторінці Крюк API , що «Запит тепер повністю побудований, але він до цих пір не проходять через db_rewrite_sql.» Чи означає це, що є ймовірність, що якийсь інший гак може переписати sql перед його запуском? Тоді я б не отримував фактичний запит у всіх ситуаціях.
jjei

2
pre_render - це, мабуть, найкраще, але я не впевнений, що запит у більшості випадків буде дуже різним.
Countzero

Насправді я думаю, що в Поглядах є помилка в деяких випадках, я щойно опублікував випуск drupal.org/node/1845772
Шон Банністер

1
$ view-> build_info ['query'], схоже, є тим самим запитом, що відображається, якщо ви включите вихід SQL Query у налаштуваннях Views.
Джонатан Елмор

Це марно. Приклад ВИБІР users.uid А.С. UID, users.created А.С. users_created, users.language А.С. users_language, users.mail AS users_mail, users.name AS users_name, 'користувач' ЯК field_data_field_first_name_user_entity_type, 'користувач' ЯК field_data_field_last_name_user_entity_type, 'користувач' ЯК field_data_field_date_of_birth_user_entity_type ВІД {користувачі} користувачів , де (((users.status <> '0') і (users.created> 1441641600))) ORDER BY users_created DESC LIMIT 20 OFFSET 0 у мене "field_data_field_first_name_user_entity_type" , який є полем користувача і в оленячої шкірі дають належних результати без змін
Марко Блажекович


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 ...
Лев

можеш мені допомогти?
Лео

1
@Leo мені потрібно більше інформації щодо того , що дивитися ви намагаєтеся запустити це на. Вихід на головній сторінці видом з вікна незмінною; здається, що ви змінили конфігурацію подання на головній сторінці, тому, звичайно, 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

// отримати результати від View Name і контекстний фільтр НДІ тут

    $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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.