Customization: Filters - Datatables for Laravel                  [               Datatables for Laravel  ](/) 

  Toggle main menu         [Docs](https://laravel-datatables.com/docs) [Demos](/demos) [Blog](https://laravel-datatables.com/blog) [Pricing](/pricing)        Search  ⌘ K   [ Log in ](/login) 

  [Docs](https://laravel-datatables.com/docs) [Demos](/demos) [Blog](https://laravel-datatables.com/blog) [Pricing](/pricing) 

 Search docs and demos  

Type at least 2 characters to search.

    Documentation menu      ### Getting Started

- [ Installation ](https://laravel-datatables.com/docs)
- [ Dark Mode ](https://laravel-datatables.com/docs/dark-mode)

### Basics

- [ Creating a Table ](https://laravel-datatables.com/docs/creating-a-table)
- [ Displaying Columns ](https://laravel-datatables.com/docs/displaying-columns)
- [ Data Sources ](https://laravel-datatables.com/docs/data-sources)
- [ Internationalisation ](https://laravel-datatables.com/docs/internationalisation)
- [ Multi-Language ](https://laravel-datatables.com/docs/multi-language)
- [ Styling ](https://laravel-datatables.com/docs/styling)

### Customization

- [ Columns ](https://laravel-datatables.com/docs/customization-columns)
- [ Cell Renderer ](https://laravel-datatables.com/docs/customization-cell-renderer)
- [ Value Formatter ](https://laravel-datatables.com/docs/customization-value-formatter)
- [ Filters ](https://laravel-datatables.com/docs/customization-filters)
- [ Pagination ](https://laravel-datatables.com/docs/customization-pagination)
- [ Sorting Icons ](https://laravel-datatables.com/docs/customization-sorting-icons)
- [ Row Actions ](https://laravel-datatables.com/docs/customization-row-actions)
- [ Multi Row Actions ](https://laravel-datatables.com/docs/customization-multi-row-actions)
- [ Loading Indicator ](https://laravel-datatables.com/docs/customization-loading-indicator)
- [ Exporting ](https://laravel-datatables.com/docs/customization-exporting)
- [ Components ](https://laravel-datatables.com/docs/customization-components)
- [ Data Sources ](https://laravel-datatables.com/docs/customization-data-sources)
- [ State Persistence ](https://laravel-datatables.com/docs/customization-state-persistence)

### Features

- [ Accessibility ](https://laravel-datatables.com/docs/feature-accessibility)
- [ Actions and Forms ](https://laravel-datatables.com/docs/actions-and-forms)
- [ Aggregate Columns ](https://laravel-datatables.com/docs/feature-aggregate-columns)
- [ Column Reordering ](https://laravel-datatables.com/docs/feature-column-reordering)
- [ Column Visibility ](https://laravel-datatables.com/docs/feature-column-visibility)
- [ Custom Filters ](https://laravel-datatables.com/docs/feature-custom-filters)
- [ Custom Controls ](https://laravel-datatables.com/docs/feature-custom-controls)
- [ Exporting ](https://laravel-datatables.com/docs/feature-exporting)
- [ Freeze Columns and Headers ](https://laravel-datatables.com/docs/feature-freeze-columns-and-headers)
- [ Pagination ](https://laravel-datatables.com/docs/feature-pagination)
- [ Responsive Mobile ](https://laravel-datatables.com/docs/feature-responsive-mobile)
- [ Row Grouping ](https://laravel-datatables.com/docs/feature-row-grouping)
- [ Row Selection ](https://laravel-datatables.com/docs/feature-row-selection)
- [ Sorting and Searching ](https://laravel-datatables.com/docs/sorting-and-searching)
- [ State Persistence ](https://laravel-datatables.com/docs/feature-state-persistence)
- [ Value Preparation ](https://laravel-datatables.com/docs/feature-value-preparation)

### Cell Renderer

- [ Action Buttons ](https://laravel-datatables.com/docs/renderer-action-buttons)
- [ Avatar ](https://laravel-datatables.com/docs/renderer-avatar)
- [ Checkmark ](https://laravel-datatables.com/docs/renderer-checkmark)
- [ Color Sample ](https://laravel-datatables.com/docs/renderer-color-sample)
- [ Email Link ](https://laravel-datatables.com/docs/renderer-email-to-link)
- [ External Link ](https://laravel-datatables.com/docs/renderer-external-link)
- [ Friendly Timestamp ](https://laravel-datatables.com/docs/renderer-friendly-timestamp)
- [ Image ](https://laravel-datatables.com/docs/renderer-image)
- [ Long Text ](https://laravel-datatables.com/docs/renderer-long-text)
- [ Phone Link ](https://laravel-datatables.com/docs/renderer-phone-link)
- [ Progress Bar ](https://laravel-datatables.com/docs/renderer-progress-bar)
- [ Status Badge ](https://laravel-datatables.com/docs/renderer-status-badge)
- [ URL Link ](https://laravel-datatables.com/docs/renderer-url-link)
- [ Wire Link ](https://laravel-datatables.com/docs/renderer-wire-link)

### Value Formatter

- [ Compact Number ](https://laravel-datatables.com/docs/formatter-compact-number)
- [ Currency ](https://laravel-datatables.com/docs/formatter-currency)
- [ Duration ](https://laravel-datatables.com/docs/formatter-duration)
- [ Friendly Filesize ](https://laravel-datatables.com/docs/formatter-friendly-filesize)
- [ Friendly Timestamp ](https://laravel-datatables.com/docs/formatter-friendly-timestamp)
- [ Locale Timestamp ](https://laravel-datatables.com/docs/formatter-locale-timestamp)
- [ Number ](https://laravel-datatables.com/docs/formatter-number)
- [ Percent ](https://laravel-datatables.com/docs/formatter-percent)

  Filters
=======

Filter UI is driven by column metadata. Enable advanced filters, then define filter types and options in columns().

1. Enable Advanced Filters
--------------------------

Set enableAdvancedFilters to true in your datatable class.

 Datatable property PHP     `public bool $enableAdvancedFilters = true;` 

 ```
public bool $enableAdvancedFilters = true;
```

2. Configure Filterable Columns
-------------------------------

Built-in filter types include text, select, multiselect, number, and date.

 columns() PHP     `Column::make('name', __('Name'))->filterable('text');Column::make('status', __('Status'))->filterable('select', options: [    'active' => __('Active'),    'inactive' => __('Inactive'),]);Column::make('tags', __('Tags'))->filterable('multiselect', options: [    'new' => __('New'),    'vip' => __('VIP'),    'returning' => __('Returning'),]);Column::make('price', __('Price'))->filterable('number');Column::make('created_at', __('Created'))->filterable('date');` 

 ```
Column::make('name', __('Name'))->filterable('text');

Column::make('status', __('Status'))->filterable('select', options: [
    'active' => __('Active'),
    'inactive' => __('Inactive'),
]);

Column::make('tags', __('Tags'))->filterable('multiselect', options: [
    'new' => __('New'),
    'vip' => __('VIP'),
    'returning' => __('Returning'),
]);

Column::make('price', __('Price'))->filterable('number');
Column::make('created_at', __('Created'))->filterable('date');
```

3. Render Your Own Filter Controls
----------------------------------

Use Column::filterRenderer() when built-in filter markup is not enough. The renderer can be a callable or a Blade view.

 Custom filter renderer hook PHP     `Column::make('state', __('State'))    ->filterable('select')    ->filterRenderer('components.datatable.filters.state-by-country');` 

 ```
Column::make('state', __('State'))
    ->filterable('select')
    ->filterRenderer('components.datatable.filters.state-by-country');
```

 Renderer payload TEXT     `The custom renderer receives:- $column (Column)- $filterState (array)- $datatable (current Datatable instance)- $isFirstInput (bool, for focus handling)` 

 ```
The custom renderer receives:
- $column (Column)
- $filterState (array)
- $datatable (current Datatable instance)
- $isFirstInput (bool, for focus handling)
```

4. Country + State Dependent Selector Example
---------------------------------------------

In this example, State stays disabled until a Country is selected.

 Datatable columns PHP     `Column::make('country_code', __('Country'))->filterable('select', options: [    'US' => __('United States'),    'CA' => __('Canada'),]);Column::make('state_code', __('State'))    ->filterable('select')    ->filterRenderer('components.datatable.filters.state-by-country');` 

 ```
Column::make('country_code', __('Country'))->filterable('select', options: [
    'US' => __('United States'),
    'CA' => __('Canada'),
]);

Column::make('state_code', __('State'))
    ->filterable('select')
    ->filterRenderer('components.datatable.filters.state-by-country');
```

 Datatable helper for state options PHP     `public function stateOptionsForCountry(?string $countryCode): array{    return match ($countryCode) {        'US' => [            'NY' => __('New York'),            'CA' => __('California'),        ],        'CA' => [            'ON' => __('Ontario'),            'BC' => __('British Columbia'),        ],        default => [],    };}` 

 ```
public function stateOptionsForCountry(?string $countryCode): array
{
    return match ($countryCode) {
        'US' => [
            'NY' => __('New York'),
            'CA' => __('California'),
        ],
        'CA' => [
            'ON' => __('Ontario'),
            'BC' => __('British Columbia'),
        ],
        default => [],
    };
}
```

 resources/views/components/datatable/filters/state-by-country.blade.php BLADE     `@php    $selectedCountry = data_get($datatable->filters, 'country_code.value');    $stateOptions = $datatable->stateOptionsForCountry($selectedCountry);@endphp    {{ __('All states') }}    @foreach($stateOptions as $stateCode => $stateLabel)        {{ $stateLabel }}    @endforeach` 

 ```
@php
    $selectedCountry = data_get($datatable->filters, 'country_code.value');
    $stateOptions = $datatable->stateOptionsForCountry($selectedCountry);
@endphp

    {{ __('All states') }}
    @foreach($stateOptions as $stateCode => $stateLabel)
        {{ $stateLabel }}
    @endforeach

```

5. Custom Multiselect + Filtering Injection Example
---------------------------------------------------

For custom multiselect UI, render the control and normalize values before they are sent to the datasource.

 Column + custom multiselect renderer PHP     `Column::make('tag', __('Tag'))    ->filterable('multiselect', options: [        'new' => __('New'),        'vip' => __('VIP'),        'returning' => __('Returning'),    ])    ->filterRenderer('components.datatable.filters.tag-multiselect');` 

 ```
Column::make('tag', __('Tag'))
    ->filterable('multiselect', options: [
        'new' => __('New'),
        'vip' => __('VIP'),
        'returning' => __('Returning'),
    ])
    ->filterRenderer('components.datatable.filters.tag-multiselect');
```

 resources/views/components/datatable/filters/tag-multiselect.blade.php BLADE     `    @foreach($column->filterOptions as $tagValue => $tagLabel)        {{ $tagLabel }}    @endforeach` 

 ```

    @foreach($column->filterOptions as $tagValue => $tagLabel)
        {{ $tagLabel }}
    @endforeach

```

 Inject filter normalization before datasource filtering PHP     `protected function mapFiltersForDataSource(array $filters): array{    $tagValues = data_get($filters, 'tag.value', []);    if (is_array($tagValues)) {        $tagValues = array_values(array_filter($tagValues, fn ($value) => $value !== null && $value !== ''));    }    if (empty($tagValues)) {        unset($filters['tag']);        return $filters;    }    $filters['tag']['operator'] = 'in';    $filters['tag']['value'] = $tagValues;    return $filters;}` 

 ```
protected function mapFiltersForDataSource(array $filters): array
{
    $tagValues = data_get($filters, 'tag.value', []);

    if (is_array($tagValues)) {
        $tagValues = array_values(array_filter($tagValues, fn ($value) => $value !== null && $value !== ''));
    }

    if (empty($tagValues)) {
        unset($filters['tag']);
        return $filters;
    }

    $filters['tag']['operator'] = 'in';
    $filters['tag']['value'] = $tagValues;

    return $filters;
}
```

Custom rendered filters are supported by the package in both Tailwind and Bootstrap filter modals.

Treat filter input as untrusted user data. Validate or normalize values in mapFiltersForDataSource() before they reach query logic.

   © 2026 Copyright (C)  [ Morrow IT Consulting &amp; Services ](https://morrow-it.services)  

 [Terms of Service](https://laravel-datatables.com/legal/terms) [Privacy](https://laravel-datatables.com/legal/privacy) [Legal Disclosure](https://laravel-datatables.com/legal/disclosure)
