syamsoul/laravel-datatable-ssp
Laravel package to run DataTables in true server-side processing (SSP). Simplifies filtering, sorting, searching, and pagination with an API inspired by the original DataTables SSP class. Supports Laravel 9+ (PHP 8+) and integrates cleanly in controllers and views.
Installation:
composer require syamsoul/laravel-datatable-ssp
Ensure Laravel 9+ and PHP 8.0+ are used.
Basic Controller Setup:
use SoulDoit\DataTable\SSP;
public function getData(SSP $ssp) {
$ssp->setColumns([
['label' => 'ID', 'db' => 'id'],
['label' => 'Name', 'db' => 'name'],
]);
$ssp->setQuery(\App\Models\User::query());
return $ssp->response()->json();
}
Blade Integration:
<table id="users-table"></table>
<script>
$(document).ready(function() {
$('#users-table').DataTable({
processing: true,
serverSide: true,
ajax: "{{ route('users.data') }}",
columns: [
{ data: 'id', name: 'id' },
{ data: 'name', name: 'name' }
]
});
});
</script>
Create a server-side paginated table for User records with search, sorting, and pagination. Use the SSP class to handle DataTables' SSP (Server-Side Processing) requests.
Controller Layer:
SSP via dependency injection or instantiate manually.$ssp->response()->json().public function __construct() {
$this->ssp = new SSP();
$this->ssp->setColumns($columns)
->setQuery($query)
->frontend()
->setFramework('datatablejs')
->setInitialItemsPerPage(10);
}
Query Configuration:
$ssp->setQuery(function ($selected_columns) {
return User::select($selected_columns)
->where('active', true)
->leftJoin('roles', 'users.id', '=', 'roles.user_id');
});
Column Customization:
label, db, formatter, and class for each column.$ssp->setColumns([
['label' => 'Full Name', 'db' => 'name', 'formatter' => function ($value, $model) {
return ucfirst($value);
}],
['label' => 'Actions', 'db' => 'id', 'formatter' => function ($value, $model) {
return '<button onclick="edit(' . $value . ')">Edit</button>';
}],
]);
Frontend Integration:
$fe_settings = $ssp->frontend()
->setResponseDataRoute('users.data')
->setInitialSorting('created_at', true)
->getSettings();
<script>
$('#table').DataTable({!! $fe_settings !!});
</script>
Dynamic Column Selection:
DB::raw() or subqueries for complex columns.$ssp->setColumns([
['label' => 'Total Orders', 'db' => DB::raw('(SELECT COUNT(*) FROM orders WHERE user_id = users.id)')],
]);
Export Functionality:
$ssp->allowExportAllItemsInCsv();
return $ssp->response()->csv('users_export_' . now()->format('Y-m-d'));
Caching Responses:
return $ssp->response()->json(120); // Cache for 120 seconds
Search Customization:
db_for_search to control which columns are searchable.name and email.$ssp->setColumns([
['label' => 'Name', 'db' => 'name', 'db_for_search' => 'name'],
['label' => 'Email', 'db' => 'email', 'db_for_search' => 'email'],
]);
Left Joins:
roles table.$ssp->leftJoin('roles', 'users.id', '=', 'roles.user_id', 'role_name', 'roles.name');
Column Name Conflicts:
DB::raw('roles.name as role_name').Formatter Issues:
null or objects) may break rendering.$model exists before accessing its properties.'formatter' => function ($value, $model) {
return $model ? $model->name : 'N/A';
}
Searchability:
'searchable' => false to exclude a column from search.['label' => 'Actions', 'db' => 'id', 'searchable' => false]
Pagination Edge Cases:
itemsPerPage === -1, the package returns all items. Ensure your query and application can handle large datasets.-1 to verify export functionality.Caching Quirks:
response()->json($cache_timeout)) uses Laravel's cache driver.$cache_timeout = 0 to disable caching entirely.Route vs. URL:
setResponseDataRoute() over hardcoding URLs for maintainability.$ssp->frontend()->setResponseDataRoute('users.data').Large Datasets:
SELECT *.DB::connection()->disableQueryLog() in development to reduce overhead.Query Logging:
DB::enableQueryLog();
$ssp->response()->json();
dd(DB::getQueryLog());
Frontend Validation:
draw, recordsTotal, recordsFiltered, data.Formatter Debugging:
'formatter' => function ($value, $model) {
return print_r($model->toArray(), true); // Debug model data
}
Column Aliasing:
db key matches the query's selected columns.DB::raw() for complex expressions:['db' => DB::raw('CONCAT(first_name, " ", last_name) as full_name')]
Custom Validation:
ValidationException for custom error handling.handle() in a service provider.Frontend Framework:
datatablejs (default) and others (custom frameworks).$ssp->frontend()->disableFetchOnInit();
Response Modification:
Response class to add custom fields or modify the JSON structure.server_time field.$ssp->response()->addField('server_time', now()->toDateTimeString());
Search Keyword Formatting:
$ssp->searchKeywordFormatter(function ($keyword) {
return '<strong>' . htmlspecialchars($keyword) . '</strong>';
});
MySQL Variables:
$ssp->setMysqlVariables(['max_allowed_packet' => '256M']);
$ssp->setQuery(function ($selected_columns) {
return User::select(array
How can I help you explore Laravel packages today?