1. Go to this page and download the library: Download machour/laravel-data-table library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
machour / laravel-data-table example snippets
namespace App\DataTables;
use Machour\DataTable\AbstractDataTable;
use Machour\DataTable\Columns\Column;
use App\Models\Product;
use Illuminate\Database\Eloquent\Builder;
use Spatie\TypeScriptTransformer\Attributes\TypeScript;
#[TypeScript]
class ProductDataTable extends AbstractDataTable
{
public function __construct(
public int $id,
public string $name,
public float $price,
public ?string $created_at,
) {}
public static function fromModel(Product $model): self
{
return new self(
id: $model->id,
name: $model->name,
price: $model->price,
created_at: $model->created_at?->format('Y-m-d H:i'),
);
}
public static function tableColumns(): array
{
return [
new Column(id: 'id', label: 'ID', type: 'number', sortable: true),
new Column(id: 'name', label: 'Nom', type: 'text', sortable: true, filterable: true),
new Column(id: 'price', label: 'Prix', type: 'number', sortable: true, filterable: true),
new Column(id: 'created_at', label: 'Créé le', type: 'date', sortable: true, filterable: true),
];
}
public static function tableBaseQuery(): Builder
{
return Product::query();
}
public static function tableDefaultSort(): string
{
return '-created_at';
}
}
use App\DataTables\ProductDataTable;
use Inertia\Inertia;
Route::get('/products', function () {
return Inertia::render('products', [
'tableData' => ProductDataTable::makeTable(),
]);
});
new Column(
id: 'price', // Must match DTO property name
label: 'Prix', // Display label
type: 'number', // text | number | date | option | multiOption | boolean
sortable: true, // Allow sorting
filterable: true, // Show in filter bar
visible: true, // Default visibility (user can toggle)
options: [...], // For type=option: [['label' => 'X', 'value' => 'x'], ...]
min: 0, // For number range (optional)
max: 100000, // For number range (optional)
icon: 'check', // Lucide icon name (optional)
searchThreshold: 5, // Show search input in option filter if >= N options
group: 'Details', // Group columns under a header (optional)
);
use Machour\DataTable\Filters\OperatorFilter;
use Spatie\QueryBuilder\AllowedFilter;
public static function tableAllowedFilters(): array
{
return [
AllowedFilter::custom('price', new OperatorFilter('number')),
AllowedFilter::custom('name', new OperatorFilter('text')),
AllowedFilter::custom('status', new OperatorFilter('option')),
AllowedFilter::custom('created_at', new OperatorFilter('date')),
AllowedFilter::custom('enabled', new OperatorFilter('boolean')),
// Remap filter name to a different DB column:
AllowedFilter::custom('display_name', new OperatorFilter('text', 'real_column')),
];
}
use Machour\DataTable\Concerns\HasExport;
class ProductDataTable extends AbstractDataTable
{
use HasExport;
public static function tableExportEnabled(): bool { return true; }
public static function tableExportName(): string { return 'products'; }
public static function tableExportFilename(): string|\Closure { return 'products-export'; }
}
use Machour\DataTable\Http\Controllers\DataTableExportController;
// Register table → class mapping
DataTableExportController::register('products', ProductDataTable::class);
// Add the export route
Route::get('/data-table/export/{table}', DataTableExportController::class)->name('data-table.export');
public static function tableFooter(\Illuminate\Support\Collection $items): array
{
return [
'price' => $items->sum('price'),
];
}
class InvoiceDataTable extends AbstractDataTable
{
public static function filterParamName(): string
{
return 'invoice_filter';
}
}