SelectQuery
implementos 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 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());
Sin embargo, el módulo Devel no es necesario, y podría drupal_set_message()
mostrar el resultado. 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;
}
Tenga en cuenta que SelectQuery::arguments()
devuelve la matriz de argumentos consulta sólo cuando se le llama después SelectQuery::__toString()
, SelectQuery::compile()
o SelectQuery::execute()
; de lo contrario, SelectQuery::arguments()
vuelve 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.
_get_query_string()
debería haber sido parte de laSelectQuery
interfaz.Puede usar dpq () para mostrar la consulta y dpr () para mostrar el resultado.
fuente
try
catch
bloque cuando falla la consulta. Por lo tanto, no es útil en mi caso si no puedo depurar la consulta rota.Otra opción es:
fuente
dpq
no parece permitir esto incluso en un intento / captura.Las respuestas anteriores son buenas cuando tiene Devel instalado y configurado.
La mejor manera de imprimir la consulta sin Devel es la siguiente.
Podemos usar una de las formas anteriores para imprimir la consulta.
fuente
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)
Espero que esto sea útil para otros chicos.
fuente