Skip to main content

Introduction

Filament’s table system is highly extensible, allowing you to create custom column types that integrate seamlessly with sorting, searching, and all other table features. Custom columns extend the base Column class and can display data in any format you need.

Understanding the Column base class

All table columns extend the Column class at packages/tables/src/Columns/Column.php. This base class provides:
  • State retrieval and formatting
  • Sorting and searching capabilities
  • Alignment and width configuration
  • Action and URL integration
  • Tooltip support
  • Record access and manipulation

Creating a basic custom column

Adding custom configuration methods

Extend your column with custom methods following Filament’s fluent API pattern:

Using embedded HTML views

For better performance, you can implement HasEmbeddedView to render HTML directly without Blade:

Implementing sortable columns

Make your column sortable by implementing custom sorting logic:

Implementing searchable columns

Add search functionality to your custom column:

Accessing state and formatting

You can format column state before display:
In your Blade view:

Using concerns for reusable functionality

Filament columns use traits to add common functionality:

Advanced example: Chart column

Here’s a complex example that renders a mini chart using Chart.js:

Working with actions

Columns can trigger actions when clicked:

Accessing the table and Livewire component

You can access the parent table and Livewire component:

Column summarization

Add summary calculations to your custom column:

Best practices

  • Always extend the Column base class
  • Use the evaluate() method for closure support in all configuration methods
  • Implement HasEmbeddedView for simple columns to improve performance
  • Use concerns (traits) for reusable functionality like CanBeCopied, HasColor, etc.
  • Access state via $getState() in Blade views or $this->getState() in the class
  • Use the setUp() method for default configuration
  • Follow naming conventions: get prefix for getters, nullable setters
  • Never use abbreviated variable names - use descriptive names
  • Use static closures (static fn) when the closure doesn’t use $this
  • Use app() instead of new for dependency injection

Publishing custom columns

Package your custom columns for reuse: