Filters - Datatables for Laravel                  [               Datatables for Laravel  ](/) [ 1.0.5](https://laravel-datatables.com/release-notes "Click to view release notes")

  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.

    Docs     

### Getting Started

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

### Basics

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

### Features

- [ Accessibility ](https://laravel-datatables.com/docs/feature-accessibility)
- [ Aggregate Columns ](https://laravel-datatables.com/docs/feature-aggregate-columns)
- [ Bulk Actions ](https://laravel-datatables.com/docs/feature-bulk-actions)
- [ Column Reordering ](https://laravel-datatables.com/docs/feature-column-reordering)
- [ Column Visibility ](https://laravel-datatables.com/docs/feature-column-visibility)
- [ Custom Controls ](https://laravel-datatables.com/docs/feature-custom-controls)
- [ Custom Filters ](https://laravel-datatables.com/docs/feature-custom-filters)
- [ Exporting ](https://laravel-datatables.com/docs/feature-exporting)
- [ Freeze Columns and Headers ](https://laravel-datatables.com/docs/feature-freeze-columns-and-headers)
- [ Inline Editing ](https://laravel-datatables.com/docs/feature-inline-editing)
- [ Pagination ](https://laravel-datatables.com/docs/feature-pagination)
- [ Responsive Mobile ](https://laravel-datatables.com/docs/feature-responsive-mobile)
- [ Row Actions ](https://laravel-datatables.com/docs/feature-row-actions)
- [ 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/feature-sorting-and-searching)
- [ State Persistence ](https://laravel-datatables.com/docs/feature-state-persistence)
- [ Value Preparation ](https://laravel-datatables.com/docs/feature-value-preparation)

### Customization

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

### 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().

Enable Advanced Filters
-----------------------

Set enableAdvancedFilters to true in your datatable class.

Datatable property

PHP

     `public bool $enableAdvancedFilters = true;` 

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

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');
```

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)
```

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

```

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.

### Related Documentation

 [Custom Filters

Features

Configure the default and build your own custom filters.](https://laravel-datatables.com/docs/feature-custom-filters) 

### Related Demos

 [Advanced Filtering

Features

Enable advanced filtering capabilities.](https://laravel-datatables.com/demos/features-advanced-filtering) 

   © 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)
