El plugin DataTables (VI). Combinar datos de varias tablas.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

datatablesEn el artículo anterior aprendimos a usar el punto más fuerte del plugin DataTables, que es poder renderizar una tabla con los datos que necesitemos obtenidos de una fuente externa. En este artículo vamos a hacer algo muy similar, pero obteniendo los datos a partir de más de una tabla. Este es el escenario más habitual que vamos a encontrar, y es necesario saber cómo hacerlo. Verás que los cambios son mínimos, y se pueden implementar sin ningún esfuerzo en nada de tiempo. Sólo hay que rediseñar la consulta adecuada para el dataset.

Si entendiste bien el artículo anterior, ahora estás a otro nivel. Ahora juegas en las ligas mayores, y tienes que seguir ascendiendo. Déjame mostrarte el camino.

EL ESCENARIO

En esta ocasión contamos con los mismos datos (por lo que al usuario se refiere) que en el artículo anterior. Sin embargo, en la base de datos los tenemos montados según un esquema que es más acorde con la forma en que se trabaja en el mundo real. Como se da la circunstancia de que cada miembro de la plantilla está en una ciudad, pero en cada ciudad hay varios miembros (en total hay 57 miembros pero sólo 7 ciudades), esto nos sugiere dos tablas: la de personal y una tabla de ciudades. En la tabla de ciudades hay dos columnas: el id, autonumérico, que actúa cómo clave primaria y el nombre de la ciudad. En la tabla de personal se ha sustituido el campo que tenía el nombre de la ciudad, por un campo numérico, en el que se ha incluido el id de cada ciudad. De este modo, se puede establecer una relación entre ambas tablas, del tipo n a 1, es decir, un número indeterminado de registros de la tabla principal (la de personal) se relacionan con un registro de la tabla secundaria (ciudades).

Además, hemos hecho lo mismo con los cargos. Aunque en este caso no hay tanta repetición (son 33 cargos para los 57 miembros de la plantilla), hemos establecido también un id para los cargos en una tabla aparte, y la hemos relacionado con la de personal.

El SQL para estas tablas lo tienes en este enlace, para que puedas recrearlas en tu equipo y seguir este artículo.

EL CÓDIGO

Cómo ya es habitual, existen dos scripts en este ejercicio: el scrript primario, que es invocado en el navegador, que renderiza la tabla y que monta el plugin DataTables y el el script secundario, que recupera los datos cada vez que es invocado y se los devuelve al plugin por Ajax.

EL SCRIPT PRIMARIO

El script primario no tiene nada de partícular. Practicamente, es una copia del que vimos en el artículo anterior, en el que lo único que camboa es el nombre del script secundario al que el plugin llama por Ajax. El listado te lo reproduzco de todos modos, para que lo tengas a mano para copiarlo y pegarlo en tu ordenador. Lo he llamado artículo_06.php:

Cómo ves, ninguna novedad aquí.

EL SCRIPT SECUNDARIO

El script secundario es harina de otro costal. Como ahora tenemos más de una tabla, también hay que tener en cuenta las relaciones entre las tablas que hay, la procedencia de cada dato y la estructura final de la consulta que recupera el dataset. Te repoduzco aquí el código, llamado datos_externos_06.php:

Lo primero, cópialo en tu carpeta localhost/datatables y carga en tu navegador localhost/datatables/articulo_06.php para ver que funciona correctamente. A continuación vamos a comentar las diferencias con el script secundario del artículo anterior.

La primera diferencia está en la declaración de los nombres de las tablas. En el script del artículo anterior se usaba sólo una, y aquí tenemos tres tablas en juego:

$tablasDeBBDD = array(
    'personal',
    'ciudades',
    'cargos'
);

Y, lógicamente, también se redefinen los orígenes de las columnas, asi:

$columnasParaRetorno = array(
    $tablasDeBBDD[0].'.nombre',
    $tablasDeBBDD[0].'.apellido',
    $tablasDeBBDD[2].'.cargo',
    $tablasDeBBDD[1].'.ciudad',
    $tablasDeBBDD[0].'.fecha_de_ingreso',
    $tablasDeBBDD[0].'.salario_bruto_anual'
);

Evidentemente, los datos cargo y ciudad no podemos obtenerlos de la tabla personal, ya que esta sólo contiene identificadores numéricos, y no es eso lo que queremos mostrarle al usuario. Por lo tanto, tenemos que obtener estos datos de las tablas que contienen los literales. Esto, en realidad, no es nada nuevo. Es el mismo modo de trabajo que usaríamos para recuperar los datos, aunque no estuviéramos usando el plugin DataTables.

La siguiente diferencia que notamos está en establecer las relaciones entre las tablas, para que los datos de los miembros de la plantilla incluyan los literales de ciudad y cargo. Lo hacemos así:

$reglasDeFiltradoDeRelaciones = '';
$reglasDeFiltradoDeRelaciones .= " (".$tablasDeBBDD[1].".id = ".$tablasDeBBDD[0].".id_ciudad ";
$reglasDeFiltradoDeRelaciones .= "AND ".$tablasDeBBDD[2].".id = ".$tablasDeBBDD[0].".id_cargo) ";

Al componer las reglas de filtrado, hay que tener en cuenta que puede haber claúsulas de búsqueda, o no haberlas y que puede haber (y, de hecho, hay) reglas de relaciones. La regla total de filtrado la componemos así:

$reglasDeFiltrado = array();
if ($reglasDeFiltradoDeUsuario > '') $reglasDeFiltrado[] = $reglasDeFiltradoDeUsuario;
if ($reglasDeFiltradoDeRelaciones > '') $reglasDeFiltrado[] = $reglasDeFiltradoDeRelaciones;
$reglasDeFiltrado = implode(" AND ", $reglasDeFiltrado);

Y ya está. El resto del código no cambia. Como ves, las relaciones entre tablas apenas añaden un poco más de trabajo al script de selección de datos. En el próximo artículo veremos nuevas funcionalidades que podemos añadirle a nuestro plugin para mejorar los resultados y la experiencia del usuario en nuestra página.

Todo el código de este artículo (scripts y base de datos) lo tienes en este enlace.

     

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *