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.

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']);
}

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

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.