Custom Filters


Related Links

Introduction

This article will show you how to define custom filters for columns not based on streams fields or in the case that you need more complicated querying.

Filter Types

There are two primary filter types by default aside from the automated search and field filter types:

Input Filter

The input filter type will display a generic text input for the filter input. An example of a custom input type filter might look like this:

'name' => [
    'filter'      => 'input',
    'query'       => MyCustomQuery::class,
    'placeholder' => 'Custom Filter',
],

Select Filter

The select filter type will display a dropdown select input for the filter input. An example of a custom select type filter might look like this:

'status' => [
    'filter'  => 'select',
    'query'   => MyCustomFilter::class,
    'options' => [
        'live'      => 'Live',
        'draft'     => 'Draft',
        'scheduled' => 'Scheduled',
    ],
],
Note: The options can also contain translatable strings.

The Query Handler

The query parameter must be a resolvable value like a closure or class/handler string. Just like other handlers, if no @method is defined then @handle will be assumed. There are 3 parameters available for injection:

\Illuminate\Database\Eloquent\Builder $query
\Anomaly\Streams\Platform\Ui\Table\TableBuilder $builder
\Anomaly\Streams\Platform\Ui\Table\Component\Filter\Contract\FilterInterface $filter

You can also inject anything else you need as this class is resolved from and called using Laravel's service container.

A simple query might look like this:

public function handle(Builder $query, FilterInterface $filter)
{
    $query->where($filter->getSlug(), 'LIKE', "%{$filter->getValue()}%");
}
Heads Up: The query will only be ran if the filter has a value.