Installation:
composer require luckykenlin/livewire-tables
php artisan make:table UsersTable --model=User
This generates a scaffolded table component in app/Http/Livewire/UsersTable.php.
First Use Case: Register the component in a Blade view:
@livewire('users-table')
The table will automatically render with default columns (ID, name, email, etc.) for the specified model.
Key Files to Review:
app/Http/Livewire/UsersTable.php (auto-generated table logic)resources/views/livewire/users-table.blade.php (auto-generated view)Define Columns:
Override the columns() method to customize columns:
public function columns()
{
return [
Column::make('ID', 'id'),
Column::make('Name', 'name')->sortable(),
Column::make('Email', 'email')->searchable(),
Column::make('Actions', 'actions', Action::class)
->format(fn($value, $row) => [
'edit' => route('users.edit', $row),
'delete' => route('users.destroy', $row),
]),
];
}
Query Scoping:
Use query() to modify the base query:
public function query()
{
return User::query()->where('active', true);
}
Pagination & Sorting: Enable via column definitions:
Column::make('Created At', 'created_at')->sortable()->searchable();
Pagination is auto-handled (default: 10 items/page).
Actions: Define reusable action buttons:
public function actions()
{
return [
Action::make('Edit', 'edit')
->icon('edit')
->url(fn($row) => route('users.edit', $row)),
Action::make('Delete', 'delete')
->icon('trash')
->method('deleteUser')
->confirm('Are you sure?'),
];
}
Bulk Actions: Add a bulk action dropdown:
public function bulkActions()
{
return [
Action::make('Delete Selected', 'bulk-delete')
->method('deleteSelected')
->confirm('Delete selected users?'),
];
}
Integration with Livewire Hooks: Use Livewire lifecycle methods for custom logic:
public function mount()
{
$this->authorize('view-users');
}
public function updatedSearch($value)
{
$this->applySearch($value);
}
Model Binding:
query() method or regenerate the table:
php artisan make:table UsersTable --model=User --force
Column Naming Conflicts:
created_at vs createdAt). Use Column::make('Label', 'column_name').TailwindCSS Dependency:
resources/views/livewire/users-table.blade.php).Eager Loading:
query():
public function query()
{
return User::with('role')->get();
}
Column::make('Role', 'role.name')
Performance:
Column::make('Large Text', 'description')->sortable(false)->searchable(false)
Query Logging: Enable Laravel’s query logging to inspect the generated SQL:
public function query()
{
\DB::enableQueryLog();
$query = User::query();
$this->tableData = $query->get();
\Log::info(\DB::getQueryLog());
return $query;
}
Livewire State: Dump the table state for debugging:
public function render()
{
\Log::debug($this->tableData);
return view('livewire.users-table');
}
Column Formatting:
Use format() for custom rendering:
Column::make('Status', 'status')
->format(fn($value) => $value === 'active' ? 'Active' : 'Inactive')
Custom Views: Override the default Blade view by publishing assets:
php artisan vendor:publish --tag=livewire-tables-views
Then modify resources/views/vendor/livewire-tables/table.blade.php.
Dynamic Columns: Load columns dynamically based on user roles:
public function columns()
{
$columns = [Column::make('ID', 'id')];
if (auth()->user()->can('manage_users')) {
$columns[] = Column::make('Actions', 'actions', Action::class);
}
return $columns;
}
API Integration: Extend the table to fetch data from an external API:
public function getTableData()
{
$response = Http::get('https://api.example.com/users');
return collect($response->json());
}
Localization: Localize column labels and action text:
Column::make(__('users-table.name'), 'name')
How can I help you explore Laravel packages today?