Introducción a las consultas dinámicas
Las consultas dinámicas se refieren a aquellas consultas que Drupal crea dinámicamente en lugar de proporcionar como una cadena SQL explícita. Todas las consultas de inserción, actualización, eliminación y fusión deben ser dinámicas. Las consultas Select pueden ser estáticas o dinámicas. Por lo tanto, "consulta dinámica" generalmente se refiere a una consulta Select dinámica.
Nota: en el 90% de los casos de uso de consultas select, tendrá una consulta estática. Si está en un camino crítico de rendimiento, debe usar query() en lugar de select() por razones de rendimiento. Use consultas dinámicas solo cuando partes de la consulta varíen (por ejemplo: agregar condiciones WHERE según el contexto) o cuando deban ser modificables.
Todas las consultas creadas dinámicamente se generan usando un objeto de consulta obtenido del objeto de conexión a la base de datos correspondiente. Como con las consultas estáticas, en la gran mayoría de los casos puede usarse una interfaz procedural para el objeto de consulta. Sin embargo, las directivas de consulta posteriores toman la forma de métodos invocados en el objeto de consulta.
Las consultas Select dinámicas se inician usando el método select() de la siguiente manera:
$database = \Drupal::database(); $query = $database->select('mytable', 'mt', $options);
En este caso, mytable es la tabla base para la consulta; la primera tabla después del operador FROM. Tenga en cuenta que no debe tener paréntesis. El constructor de consultas manejará esto automáticamente. El segundo parámetro es el alias de la tabla. Si no se especifica, se usa el nombre de la tabla. El arreglo $options es opcional y es idéntico al arreglo $options para consultas estáticas.
El valor retornado por la llamada $database->select() es un objeto del tipo Select. Por lo tanto, el tipo de valor en la variable $query después de esta llamada es un objeto Select. Este objeto tiene una lista completa de métodos, como fields(), joins() y group(), que pueden invocarse para definir aún más la consulta.
Las consultas Select dinámicas pueden ser muy simples o muy complejas. A continuación revisaremos las partes que conforman una consulta simple, y en páginas siguientes analizaremos métodos más complejos como las uniones (joins).
Panorama general
Este es un ejemplo relativamente simple de una consulta a la tabla de usuarios.
Supongamos que queremos construir una consulta dinámica que sea aproximadamente equivalente a la siguiente consulta estática:
$result = $database->query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");
El equivalente dinámico comienza así:
// Crear un objeto de tipo Select. $database = \Drupal::database(); $query = $database->select('users', 'u'); // Agregar detalles extras a este objeto de consulta: una condición, campos y un rango. $query->condition('u.uid', 0, '<>'); $query->fields('u', ['uid', 'name', 'status', 'created', 'access']); $query->range(0, 50);
Esto a menudo se escribe usando una sintaxis abreviada que permite llamar varios métodos del objeto $query de forma encadenada. Por eso el código anterior se suele escribir así:
// Crear un objeto de tipo Select. $query = $database->select('users', 'u'); // Agregar detalles extras a este objeto de consulta: una condición, campos y un rango. $query->condition('u.uid', 0, '<>') ->fields('u', ['uid', 'name', 'status', 'created', 'access']) ->range(0, 50);
De hecho, el código puede simplificarse aún más encadenando directamente la llamada $database->select() con llamadas a métodos en el objeto resultante. Esto da:
// Crear un objeto de tipo Select y agregar directamente detalles extras // a este objeto de consulta: una condición, campos y un rango. $query = $database->select('users', 'u') ->condition('u.uid', 0, '<>') ->fields('u', ['uid', 'name', 'status', 'created', 'access']) ->range(0, 50);
Esta es la forma simplificada de consulta usada por la página de administración de usuarios, que puede usarse como referencia para un estudio más profundo.
Ejecutar la consulta
Una vez que la consulta está construida, llame al método execute() para compilar y ejecutar la consulta.
$result = $query->execute();
El método execute() retornará un objeto de conjunto de resultados/statement, idéntico al objeto retornado por la función $database->query(), y puede iterarse o extraerse de la misma forma:
$result = $query->execute(); foreach ($result as $record) { // Hacer algo con cada $record. }
Nota. Sea cuidadoso al usar los siguientes métodos con consultas dinámicas que devuelven múltiples columnas:
Estos métodos actualmente requieren índices numéricos de columnas (0, 1, 2, etc.) en lugar de alias de tabla. Sin embargo, el constructor de consultas actualmente no garantiza ningún orden específico para los campos devueltos, por lo que las columnas pueden no estar en el orden esperado. En particular, las expresiones siempre se añaden después de los campos, incluso si se agregan primero en la consulta. (Este problema no afecta a las consultas estáticas, que siempre devuelven las columnas en el orden especificado).
Depuración
Para inspeccionar la consulta SQL que el objeto de consulta usa en un punto determinado de su ciclo de vida, imprima el objeto de consulta. Para revisar los argumentos, vea el arreglo retornado por el método arguments():
echo $query; print_r($query->__toString()); print_r($query->arguments());
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.