Type to search columns, filters, options, and extensions.

↑↓ to navigate · Enter to open · Esc to close

Documentation

Recipe: Filters

Add a declarative filter popover to a Doctrine server-side table

What / When

Add configureFilters() when users need structured filters (text, choice, date range, number range, association) on a server-side Doctrine table.

Minimal Example

use Doctrine\ORM\QueryBuilder;
use Pentiminax\UX\DataTables\Filter\ChoiceFilter;
use Pentiminax\UX\DataTables\Filter\TextFilter;
use Pentiminax\UX\DataTables\Model\Filters;

public function configureFilters(Filters $filters): Filters
{
    return $filters
        ->add(TextFilter::new('email')->label('Email'))
        ->add(
            ChoiceFilter::new('status')
                ->label('Status')
                ->options([
                    'Draft' => 'draft',
                    'Published' => 'published',
                ])
        );
}

Price range and category

use App\Entity\Category;
use Doctrine\ORM\QueryBuilder;
use Pentiminax\UX\DataTables\Filter\EntityFilter;
use Pentiminax\UX\DataTables\Filter\NumberRangeFilter;

public function configureFilters(Filters $filters): Filters
{
    return $filters
        ->add(NumberRangeFilter::new('price')->label('Price'))
        ->add(
            EntityFilter::new('category')
                ->label('Category')
                ->entity(Category::class)
                ->optionLabel('name')
                ->optionsQuery(static function (QueryBuilder $qb): void {
                    $qb->andWhere('e.archived = false');
                })
                ->multiple()
        );
}

Leave a bound empty to filter on one side only. The category list is loaded when the table renders and fails above 200 entries: narrow it with optionsQuery() or raise limit().

Pitfalls