Jun 062011
 

Post to Twitter Post to Facebook


Drupal interactúa constantemente con una base de datos determinada, todos los comentarios, contenidos y demás elementos de drupal se encuentran almacenados y drupal rescata esta información para mostrar estos datos.

Dentro de drupal encontramos una capa de abstracción que “protege” a drupal de las diferencias existentes entre la ingeniería de las diferentes bases de datos, gracias a esta capa podemos escribir un mismo código independientemente de la base de datos con la que estemos trabajando además de prevenir posibles ataques SQL inyection.Basada en objetos PDO (PHP´s Data Object) y  en el principio de que la escritura SQL es  más conveniente que aprender una sintaxis nueva.

En versiones anteriores de drupal realizaríamos nuestras consultas de la siguiente forma:


$result = db_query('SELECT name FROM {role} WHERE rid = :rid', array(':rid' => 2));

Esta forma de construir nuestras consultas puede servirnos perfectamente hasta cierto punto , pero ¿Cómo nos defendemos de consultas más complicadas?.Unas de las características de Drupal 7 es la posibilidad de crear query objects mediante  un query builder que harán mas manejables estas consultas complejas.De esta forma podríamos reescribir nuestra consulta anterior de la siguiente forma :


$query = db_select('role', 'r');
 $result = $query
 ->condition('rid',2)
 ->fields('r',array('name'))
 ->execute();

Ordenando resultados

Para ordenar el resultado de nuestra consulta simplemente usamos el método orderBy, si quisiéramos por ejemplo ordenar los resultados por name ascendentemente haríamos lo siguiente:


$query = db_select('role', 'r');
 $result = $query
 ->condition('rid',2)
 ->fields('r',array('name'))
 ->orderBy('name', 'ASC')
 ->execute();
Paginando resultados

Paginar resultados en drupal es extremádamente fácil.Supongamos que queremos mostrar un listado de todas nuestras nuestros nodos de tipo page, probablemente recibamos decenas de filas como resultado y por tanto necesitamos paginar los resultados por usabilidad.Para llegar a nuestro objetivo en primer lugar crearemos un menu item (ver el artículo anterior) y definiremos nuestra callback para mostrar los resultados que buscamos de la siguiente forma:


/**
 * Page callback
 */
function mimodulo_micallback(){

 //Creamos el query object y extendemos el object para que use un paginador por defecto
 $query = db_select('node','n')->extend('PagerDefault');
 //Construimos nuestra query indicando el número de elementos que
 //queremos que aparezcan por página.
 $query
 ->condition('type','page')
 ->fields('n',array('title'))
 ->limit(5);

 $result= $query ->execute();
 //Iteramos sobre los resultados para contruir la cadena que devolveremos
 $output = '';
 foreach ($result as $row) {

 $output .= $row->title."</br>";

 }
 //LLamamos a la función de tematización y aplicamos el tema de paginación a
 //nuestra salida y retornamos
 $output .= theme('pager');
 return $output;
 }

Imagen del listado de paginas paginado

Si todo ha ido bien , habremos obtenido nuestro paginador funcionando tal como se muestra en la figura y el cual nos ha sido muy facil crear :)

Fuente : Pro Drupal 7 Development

  4 Responses to “Query Builder and Query Objects”

  1. He seguido tus ejercicios anteriores… y todos funcionaron bien.
    pero este ejercicio no me arroja ningun resultado…
    he estado utilizando el codigo incluso sobre el mismo callback del ejercicio anterior (Farewell), para verificar si el llamado a la funcon sea efectuado.. pero con este codigo no me muestra nada…
    alguna idea?…
    Saludos
    @Mlaynes

    • Perdona por tardar en contestarte, estos días he andado algo liado.
      Me imagino que habrás limpiado la caché y habilitar de nuevo el módulo.Es muy frecuente que no se muestren resultados por esas cosas.Si no comunicate conmigo por twitter y miramos que puede ser.
      Un saludo y gracias por tu comentario

  2. Hola Jose Luis,

    En mi proceso de aprendizaje, he intentado duplicar este ejercicio a través de un módulo que llame example1, pero al invocarlo me genera error: El sitio web no puede mostrar la página en explorer y Error de servidor con chrome, buscando el error imprimir contenido recuperado en foreach con print_r($row ); para asegurar recuperación de datos hasta aquí OK, pero al habilitar la línea return $output; es donde me genera el error; me podes dar alguna idea, de antemano muchas gracias

  3. buenas enhorabuena por el blog.

    He intentado hacer una sencilla consulta pero el drupal me retorna este error:

    Mensaje de error
    PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table ’1267808-3.users’ doesn’t exist: SELECT uid FROM (users); Array ( ) en rutas() (línea 48 de /homez.378/nouestud/www/ferrerets/sites/all/modules/formexample/formexample.module).

    perdona por las molestias, pero podrías darme una ayudita :D. Gracias.

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>