it-swarm-es.com

Imprima la consulta que se genera utilizando db_select ()

Quiero imprimir la consulta que se construye usando db_select () de forma programática. ¿Hay alguna función API proporcionada por Drupal Abstraction Layer?
Es similar al resultado de la consulta en Vistas, pero quiero imprimirlo desde mi módulo personalizado para fines de depuración.

62
Sithu

SelectQuery implementa SelectQuery::__toString() , que se llama en los contextos donde se requiere una cadena.

Considere el siguiente código.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print $query;

Su salida es la siguiente.

SELECT block.*
FROM 
{block} block
WHERE  (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)

Para obtener la matriz de argumentos utilizados para la consulta, puede llamar a SelectQuery::arguments() .

El siguiente código imprime la consulta y sus argumentos utilizando las funciones disponibles desde el módulo Devel.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

dpm((string) $query);
dpm($query->arguments());

screenshot

Sin embargo, el módulo Devel no es necesario, y podría drupal_set_message() para mostrar la salida. Por ejemplo, podría usar la siguiente función para obtener una cadena con los marcadores de posición reemplazados por sus valores reales.

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

El código de ejemplo anterior que mostré se convertiría en el siguiente.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

drupal_set_message(format_string('Query: %query', array('%query' => _get_query_string($query))));

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

Observe que SelectQuery::arguments() devuelve la matriz de argumentos de consulta solo cuando se llama después de SelectQuery::__toString(), SelectQuery::compile() , o SelectQuery::execute() ; de lo contrario, SelectQuery::arguments() devuelve NULL.

Puede usar una función similar a la siguiente para obtener la consulta de cadena, con los marcadores de posición reemplazados por los argumentos.

68
kiamlaluno

Puede usar dpq () para mostrar la consulta y dpr () para mostrar el resultado.

  $query = db_select('users','u');
  $query->fields('u');
  $query->condition('u.uid', 1042);
  $result = $query->execute()->fetchAll();

  dpq($query); // Display the query. 
  dpr($result); // Display the query result.
47
umesh

Otra opción es:

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print strtr((string) $query, $query->arguments());
19
vijaycs85

Las respuestas anteriores son buenas cuando tiene Devel instalado y configurado.

La mejor manera de imprimir la consulta sin Devel es la siguiente.

$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
//One way
echo $query->__toString();
// Second way
echo (string)$query;

Podemos usar una de las formas anteriores para imprimir la consulta.

8
KiranD

Tengo una buena solución que puede copiar/pegar su cadena de consulta directamente en la sección "SQL" en Phpmyadmin y depurar su consulta (a menudo uso este método cuando tengo problemas con la consulta)

$querystring=$query->__toString();
$querystring=str_replace("{",'',$querystring);
$querystring=str_replace("}",'',$querystring);
foreach($query->getArguments() as $key=> $item){

    if(!$item) {
        $item = 'NULL';
    }
    $querystring=str_replace($key.')',$item.')',$querystring);
}
dpm($querystring);

Espero que esto sea útil para otros chicos.

4
Yusef

Versión Drupal 8:

$query = \Drupal::entityQuery('node')
    ->addTag('debug')
    ->execute();
0
Tien Wang