SelectQueryimplementos 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 laSelectQueryinterfaz.Puede usar dpq () para mostrar la consulta y dpr () para mostrar el resultado.
fuente
trycatchbloque 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
dpqno 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