Datatables that supports pagination and recursive searching in relations
holacliente/laravel-datatables is a Laravel package for datatables that supports pagination and recursive searching in relations.
It currently has 0 GitHub stars and 339 downloads on Packagist (latest version 2.4.5).
Install it with composer require holacliente/laravel-datatables.
Discover more Laravel packages by holacliente
or browse all Laravel packages to compare alternatives.
Last updated
Un paquete Laravel potente para procesamiento server-side de DataTables con soporte avanzado para búsqueda, filtrado, paginación y relaciones.
✨ Procesamiento Server-Side: Manejo eficiente de grandes conjuntos de datos
🔍 Búsqueda Avanzada: Búsqueda recursiva en relaciones usando notación de puntos
📊 Paginación Inteligente: Soporte automático de paginación y límites
🔗 Relaciones: Búsqueda y ordenamiento en modelos relacionados
🛡️ Seguridad: Cifrado integrado para campos sensibles
📝 Soft Deletes: Soporte para registros eliminados suavemente
⚡ Eager Loading: Prevención de consultas N+1
🎯 Multi-Tabla: Soporte para múltiples DataTables en una página
🔄 Filtros Avanzados: Donde, whereIn, whereYear, whereHas y más
📦 Flexible: Funciona con Eloquent, SQL crudo y colecciones
| Versión PHP | Estado | Notas | |------------|--------|-------| | 7.1 - 7.3 | ✅ Soportado | Versión mínima requerida | | 7.4+ | ✅ Optimizado | Recomendado - Máxima compatibilidad | | 8.0+ | ✅ Soportado | Compatible con PHP 8.x | | 8.1+ | ✅ Soportado | Compatible con PHP 8.1+ |
composer require holacliente/laravel-datatables
El paquete se registrará automáticamente en Laravel 5.5+.
use ACFBentveld\DataTables\DataTables;
DataTables::model(new User())
->searchable('name', 'email')
->get();
DataTables::model(new User())
->searchable('name', 'email', 'role.name', 'department.title')
->with('role', 'department')
->get();
Desde v2.0.25 (25/02/2021), ahora puedes ejecutar consultas SQL directas:
DataTables::query("SELECT * FROM users WHERE status = 'active'")->get();
O con Query Builder:
DataTables::query(DB::table('users')->where('status', 'active'))->get();
DataTables::model(new User())
->where('status', '=', 'active')
->whereIn('role_id', [1, 2, 3])
->whereYear('created_at', 2024)
->searchable('name', 'email')
->with('role')
->exclude('password', 'remember_token')
->get();
// Incluir registros eliminados
DataTables::model(new User())
->withTrashed()
->get();
// Mostrar solo registros eliminados
DataTables::model(new User())
->onlyTrashed()
->get();
DataTables::model(new User())
->encrypt('ssn', 'api_key', 'password')
->get();
DataTables::model(new User())
->select('id', 'name', 'email', 'role_id') // Solo estas columnas
->exclude('password', 'remember_token') // O excluir estas
->get();
DataTables::model(new User())
->distinct('category_id')
->get();
DataTables::model(new User())
->table('users_datatable')
->get();
DataTables::model(new Post())
->table('posts_datatable')
->get();
🚀 Endurecimiento del modo cursor + select()
COUNT(*) (total y filtrado) en páginas siguientes cuando
cursorPaginate() está activo y se envía ?cursor=.... Reduce de 3 a 1 query
pesada por request a partir de la segunda página.(int) — soporta UUIDs, timestamps y hashes.
La dirección (< o >) se infiere del ORDER BY solicitado.select([]) vacío: si tras exclude()/select() no quedan
columnas, se descarta la cláusula en vez de generar SQL inválido.🚀 Optimizaciones de Rendimiento: Paginación por Cursor (Keyset)
Esta versión ataca los cuellos de botella en consultas con OFFSET profundo
y ordenamiento/paginación en memoria sobre tablas grandes.
cursorPaginate(string $column = 'id') (opt-in)
LIMIT n OFFSET m por WHERE column > :cursor LIMIT nOFFSET alto en tablas grandesnextCursor cuando está activosortModel() ahora empuja ORDER BY + LIMIT al SQL cuando no hay
búsqueda activa (antes traia toda la tabla a PHP y aplicaba slice())start y length se castean a int con defaults seguros (0 y 10)Ejemplo de uso del cursor pagination:
DataTables::query(
Result::query()
->join('reports', 'results.report_id', '=', 'reports.id')
->where('reports.campaign_id', $campaignId)
)
->cursorPaginate('results.id')
->get();
El frontend debe enviar ?cursor=<nextCursor> en cada request siguiente.
Nota: La paginación por cursor no permite saltar a una página arbitraria por número — solo navegación secuencial (siguiente). Ideal para tablas grandes donde el usuario hace scroll/next-page lineal o procesos de exportación.
🆕 Mejoras de Compatibilidad con PHP 7.4+
implode() con join() para máxima compatibilidad
Razones del cambio:
join() es alias de implode() desde PHP 5.3query() para ejecutar consultas SQL directasimplode() a join() (v2.2.0)Problema identificado: implode() está siendo deprecado en favor de join() en versiones recientes de PHP.
Solución implementada:
implode() con join()Archivos modificados:
src/DataTables.php (3 cambios)Ejemplo del cambio:
// Antes (PHP 7.4+ deprecado)
$set = implode(',', $value);
// Después (Compatible con todas las versiones)
$set = join(',', $value);
Reporta problemas en: GitHub Issues
Lee CONTRIBUTING.md para más información sobre cómo contribuir al proyecto.
MIT License - Ver LICENSE.md
Este paquete es un fork mejorado del proyecto original ACFBentveld\DataTables, con mejoras continuas en compatibilidad, rendimiento y funcionalidad.