Installation:
composer require mediconesystems/livewire-datatables
For Laravel 9, also run:
composer require psr/simple-cache:^1.0 maatwebsite/excel
Publish Config (Optional):
php artisan vendor:publish --provider="MedicOneSystems\LivewireDatatable\LivewireDatatableServiceProvider"
First Usage: Create a Livewire component:
php artisan make:livewire Admin/UserDatatable
Update the component:
<?php
namespace App\Http\Livewire\Admin;
use MedicOneSystems\LivewireDatatable\Columns\Column;
use MedicOneSystems\LivewireDatatable\Http\LivewireDatatable;
use App\Models\User;
class UserDatatable extends LivewireDatatable
{
public function configure(): void
{
$this->setPrimaryKey('id');
$this->setModel(User::class);
$this->setSearch(['name', 'email']);
$this->setPerPage(10);
}
public function columns(): array
{
return [
Column::make("ID", "id"),
Column::make("Name", "name"),
Column::make("Email", "email"),
];
}
}
Render in Blade:
<livewire:admin.user-datatable />
configure() method to set the model, primary key, and searchable fields.columns() method.public function configure(): void
{
$this->setModel(User::class);
}
public function configure(): void
{
$this->setQuery(\DB::table('users'));
}
Column::make("Name", "name")
Column::make("Full Name", "name")
->format(fn($value, $row) => ucfirst($value))
Column::make("User Role", "role")
->format(fn($value) => $value === 'admin' ? 'Administrator' : 'User')
public function configure(): void
{
$this->addFilter(
Column::make("Active Users", "active")
->boolean()
);
}
$this->addFilter(
Column::make("Created At", "created_at")
->date()
);
$this->addFilter(
Column::make("Status", "status")
->select([
'' => 'All',
'active' => 'Active',
'inactive' => 'Inactive'
])
);
public function configure(): void
{
$this->setQuery($this->query()->when(
$this->getFilter('active'),
fn($query) => $query->where('active', $this->getFilter('active'))
));
}
public function configure(): void
{
$this->addAction(
Action::make('Delete')
->icon('trash')
->color('danger')
->action(fn($row) => $this->deleteUser($row))
);
}
public function columns(): array
{
return [
ColumnGroup::make([
Column::make("ID", "id"),
Column::make("Name", "name"),
], "User Info"),
];
}
public function mount(): void
{
$this->dispatchBrowserEvent('user-updated');
}
public function configure(): void
{
$this->setTableClasses('bg-white');
}
<script>
document.addEventListener('livewire:init', () => {
Alpine.data('tableActions', () => ({
confirmDelete(id) {
if (confirm('Are you sure?')) {
@this.call('deleteUser', id);
}
}
}));
});
</script>
setModel() or setQuery() in configure().order, limit) as column names can cause SQL errors.columns() method.setPerPage() or missing setPrimaryKey().setPrimaryKey() is set and setPerPage() is configured.configure() method updates the query correctly.\DB::enableQueryLog();
$this->query()->get();
\Log::info(\DB::getQueryLog());
dd($this->getFilter('column_name'));
MedicOneSystems\LivewireDatatable\Columns\Column.MedicOneSystems\LivewireDatatable\Actions\Action.configure() method and adding custom filter logic.buildQuery() method to inject custom query logic.config/livewire-datatables.phptable_classes: Customize the table container classes.thead_classes: Customize the header classes.tbody_classes: Customize the body classes.public function configure(): void
{
$this->setModel(User::class)->setRelation('role', 'role');
}
public function configure(): void
{
$this->setQuery(User::select('id', 'name', 'email'));
}
cursor() instead of get().<?php
namespace App\Http\Livewire\Admin;
use MedicOneSystems\LivewireDatatable\Columns\Column;
use MedicOneSystems\
How can I help you explore Laravel packages today?