---
url: 'https://metadrop.net/es/articulos/depurar-consultas-sql'
title: 'Depurar consultas SQL'
author: 'Ricardo Sanz'
date: '2017-01-17T09:49:06+00:00'
updated: '2026-08-04T08:11:52+00:00'
type: article
summary: 'Depuración de consultas a base de datos en Drupal.'
tags:
  - SQL
  - Debug
  - Entities
published: true
og:
  determiner: Automatic
  site_name: Metadrop
  'image:alt': 'Depurar consultas SQL'
  street_address: 'Calle Manuel Luna, 12, 3 Dcha'
  locality: Madrid
  region: Madrid
  postal_code: '28020'
  country_name: España
  email: hola@metadrop.net
  phone_number: '910053180'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      '@type': Article
      '@id': 'https://metadrop.net/es/articulos/depurar-consultas-sql#article'
      name: 'Depurar consultas SQL'
      headline: 'Depurar consultas SQL'
      description: 'Depuración de consultas a base de datos en Drupal.'
      about:
        - SQL
        - Debug
        - Entidades
      datePublished: '2014-11-24T08:00:00+0100'
      dateModified: '2026-08-04T10:11:52+0200'
      author:
        '@type': Person
        name: 'Ricardo Sanz'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
      mainEntityOfPage: 'https://metadrop.net/es/articulos/depurar-consultas-sql'
    -
      '@type': Organization
      '@id': 'https://metadrop.net/#organization'
      url: 'https://metadrop.net/'
      name: Metadrop
      sameAs:
        - 'https://www.drupal.org/metadrop'
        - 'https://twitter.com/metadrop'
        - 'https://asociaciondrupal.es/partner/metadrop'
        - 'https://www.linkedin.com/company/metadrop'
      logo:
        '@type': ImageObject
        url: 'https://metadrop.net/themes/custom/mdrop_radix/logo-metadrop-500-500.jpg'
        width: '500'
        height: '500'
    -
      '@type': ItemPage
      '@id': 'https://metadrop.net/es/articulos/depurar-consultas-sql'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Inicio
            item: 'https://metadrop.net/es'
          -
            '@type': ListItem
            position: 2
            name: 'Artículos expertos sobre Drupal y tecnología'
            item: 'https://metadrop.net/es/articulos'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
---
 1. [Artículos](https://metadrop.net/es/articulos)
 
  

# Depurar consultas SQL

Lunes 24 de Noviembre de 2014

 

 



Depuración de consultas a base de datos en Drupal.



   



Cuando se trabaja con EntityFieldQuery, db\_select y otras formas de abstracción del SQL a veces se quiere acceder a la consulta efectiva SQL que se realiza, normalmente cuando uno está depurando. Los objetos de tipo SelectQuery, InsertQuery, UpdateQuery, etc, implementan el método mágico de PHP \_\_toString(), de forma que basta hacer un casting a string para ver el SQL de la consulta:

```php
$query_object = db_select('users', 'u')->fields('u');
$query_text = (string) $query_object;
```

El valor de $query\_text será:

```sql
SELECT u.* FROM {users} u 
```

Sin embargo, EntityFieldQuery no implementa el método \_\_toString(), por lo que hay que usar un truco. EntityFieldQuery, internamente, usa un objeto SelectQuery que sí dispone del método \_\_toString(). Basta con engancharse en el punto adecuado y mostrar la consulta, una vez es ya un objeto SelectQuery. Para ello habrá que hacer dos cosas: marcar la consulta para ser 'depurada' mediante una etiqueta a la query e implementar el hook\_query\_alter().

Por ejemplo, supongamos que tenemos el siguiente EntityFieldQuery:

```php
$efq = new EntityFieldQuery;
$result = $efq->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'page')
    ->execute();
```

Para depurarlo habría que añadirle una etiqueta, por ejemplo 'efq\_debug':

```php
$efq = new EntityFieldQuery;
$result = $efq->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'page')
    ->addTag('efq_debug')
    ->execute();
```

E implementar el correspondiente hook:

```php
function mymodule_query_alter($query) {
  if ($query->hasTag('efq_debug')) {
    dpm((string) $query, 'Consulta');
    dpm($query->arguments(), 'Argumentos');
  }
}
```

Como resultado obtenemos para el primer dpm:

```sql
SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle, :entity_type AS entity_type
FROM 
{node} node
WHERE  (node.type = :db_condition_placeholder_0) 
```

Como puede verse la consulta viene con placeholders. Esta es la razón por la que se incluye el segundo dpm(), con los argumentos de la consulta:

```plaintext
:db_condition_placeholder_0 (String, 4 characters ) page
:entity_type (String, 4 characters ) node
```

Obviamente esto solo debería estar activado en desarrollo. Me hubiese gustado haber pensado esta forma de depurar el EntityFieldQuery pero antes de hacerlo busqué y encontré una [respuesta de Clive](https://drupal.stackexchange.com/a/36549/2604), el Chuck Norris de Drupal Answers.

## Actualización

Como comentan en la propia pregunta ahora el módulo [devel](https://www.drupal.org/project/devel) [incluye este *truco*](https://www.drupal.org/node/1858318): basta con añadir la etiqueta debug:

```php
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node')
  ->addTag('debug')
  ->execute();
```



[SQL](https://metadrop.net/es/articulos?text=SQL)

[Debug](https://metadrop.net/es/articulos?text=Debug)

[Entidades](https://metadrop.net/es/articulos?text=Entidades)

 

- Ricardo Sanz
    
    CTO
 
[Servicios de Auditoría Web](https://metadrop.net/es/servicios/auditoria-web " See Servicios de Auditoría Web")

Auditorías web independientes de accesibilidad, SEO, rendimiento, seguridad y experiencia de usuario — en Drupal o cualquier plataforma. Se obtiene un plan de corrección priorizado y accionable con esfuerzo estimado.

 

 Ver más