Obtener la consulta real ejecutada por una vista

23

Necesito encontrar la consulta SQL que ejecuta una consulta determinada. El módulo de vistas puede mostrar el SQL al configurar la vista, pero aparentemente la consulta no es la consulta real que se ejecuta en todos los casos .
Soy consciente de que el módulo Devel puede mostrar las consultas de la base de datos, pero devel no puede mostrar las consultas reales, excepto hacer clic en el enlace 'A' asociado con cada consulta y hay cientos de ellas .

¿Cómo puedo encontrar la consulta real que ejecuta la vista? La vista se muestra como un bloque.

jjei
fuente

Respuestas:

40

Debe usar hook_views_pre_execute y con Devel instalado, use dpqpara ver la cadena SQL:

function hook_views_pre_execute(&$view) {
  dpq($view->build_info['query']);
}
Countzero
fuente
Gracias. Se lee en la página de la api de enlace que "La consulta ahora está completamente construida, pero aún no se ha ejecutado a través de db_rewrite_sql". ¿Significa esto que existe la posibilidad de que algún otro gancho pueda reescribir el sql antes de su ejecución? Entonces no obtendría la consulta real en todas las situaciones.
jjei
2
pre_render es probablemente el mejor, pero no estoy seguro de que la consulta sea muy diferente en la mayoría de los casos.
Countzero
De hecho, creo que hay un error en Views en algunos casos, acabo de publicar un problema drupal.org/node/1845772
Sean Bannister
1
$ view-> build_info ['query'] parece ser la misma consulta que Vistas visualiza si habilita la salida de Consulta SQL en la configuración de Vistas.
Johnathan Elmore
Esto es inútil Ejemplo 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, 'usuario' AS field_data_field_first_name_user_entity_type, 'usuario' AS field_data_field_last_name_user_entity_type, 'usuario' AS field_data_field_date_of_birth_user_entity_type DE {users} usuarios DONDE (((users.status <> '0') AND (users.created> 1441641600))) ORDENAR por users_created DESC LIMIT 20 OFFSET 0 Tengo "field_data_field_first_name_user_entity_type", que es el campo de usuario y no da los resultados adecuados sin alteraciones
Marko Blazekovic
4
function hook_views_pre_execute(&$view) {
  if ($view->name == 'XYZ') {
    $query = (string)$view->build_info['query'];
    echo $query;
  }
}
Sandesh Manghale
fuente
2

No necesita parches ni ganchos.

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

Da esto como salida

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
fuente
Lo siento, pero mi salida es diferente: 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
¿me puedes ayudar?
Leo
1
@Leo Necesito más información sobre en qué vista estás tratando de ejecutar esto. El resultado es para la vista de la página principal sin modificaciones; Parece que ha cambiado la configuración de la vista de portada, por lo que, por supuesto, el SQL será diferente.
mikeytown2
Gracias por responderme, tal vez crearé una pregunta e insertaré el enlace a continuación, para no enviar esta respuesta por correo no deseado
Leo
En el enlace de la pregunta, espero haber quedado
Leo
1

Por favor prueba este parche:

--- 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
fuente
0

// Obtenga los resultados por nombre de vista y nid de filtro contextual aquí

    $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;

Consulte el documento para obtener más referencias: https://api.drupal.org/api/views/views.module/function/views_get_view_result/7.x-3.x

Sameer Choudhary
fuente