martes, 6 de febrero de 2018

Laravel DataTables 5

Hablemos de filtros y buscadores, características estrella en DataTables.

Como ya habremos observado nada más aplicar DataTables por primera vez en jQuery, en la esquina superior derecha de la tabla se puede ver un campo de búsqueda. Al escribir en él, inmediatamente filtra la tabla, mostrando solo las filas que contengan esos caracteres en cualquier columna.

En el modo server-side la búsqueda también la realiza mediante llamadas al servidor. El propio Laravel DataTables se encarga de recoger esos parámetros y aplicar los WHEREs necesarios. En estos WHEREs, como ya expliqué en el capítulo anterior, utilizará el campo indicado en Javascript como name.

Todo esto va bien para la mayoría de casos. Pero la programación sería muy aburrida si no hubieran casos especiales, ¿verdad?
Para estos casos especiales, en los que la información visible en la tabla no es exactamente igual a cómo está guardada en la base de datos, en Laravel DataTables tenemos el método filterColumn.

El ejemplo más típico serían las fechas. En la web mostramos 30/01/2018, pero en la base de datos puede estar guardado como 2018-01-30, o como 1517310949. Para esto... la verdad es que es complicado. De momento he conseguido con un plugin para jQuery DataTables, pero ha requerido unos cuantos trucos en ambos lados para buscar por rango de fechas. Esto me lo reservo para otro capítulo.

Otro ejemplo habitual serían las columnas de Nombre y de Apellidos. Es muy normal guardar estos datos por separado, pero mostrarlos como si fueran una columna. Puede ser uniéndolos directamente en la query (CONCAT(`nombre`, " ", `apellidos`) AS `nombre_completo`) y metiendo el nombre de este alias como name en Javascript. En tal caso filterColumn deja de ser necesario.

Otra manera, la que vemos en la documentación oficial, es inventando el mismo alias dentro de filterColumn.

                ->filterColumn('nombre_completo', function($query, $clave) {

                    $sql = "CONCAT(`nombre`, " ", apellidos)  LIKE ?";

                    $query->whereRaw($sql, ["%{$clave}%"]);

                })

Es posible que me haya explicado fatal. Lo siento; es la primera vez que escribo documentación sobre algo así. ^_^u
En el próximo capítulo voy a improvisar un ejemplo, y exponerlo todo de manera más práctica.

No hay comentarios:

Publicar un comentario