Query Scopes & Filters

Query scopes and filters allow you to narrow down query results using custom conditions.

You may create scopes that can be used in various places, such as inside the collection tag or inside control panel listings.

Scopes

Any scope classes located within app/Scopes will be automatically registered.

You may create a scope class by running php please make:scope, which will give you a class with a few methods for you to implement, for example:

<?php

namespace App\Scopes;

use Statamic\Query\Scopes\Scope;

class Featured extends Scope
{
    public function apply($query, $values)
    {
        $query->where('featured', true);
    }
}

The apply method will give you a query builder instance, allowing you to modify it how you see fit.

It will also give you $values, which will be an array of contextual values. For example, when using the scope on a collection tag, you will get all the parameter values. When used as a filter inside the control panel, you will get all of your filter’s field values.

Filters

Filters are UI based scopes that will be displayed in listings inside the Control Panel.

You’re able to configure any number of fields to a filter to allow your users to refine their listings.

You may create a filter class by running php please make:filter, which will give you a class with a few methods for you to implement, for example:

<?php

namespace App\Scopes;

use Statamic\Query\Scopes\Filter;

class Featured extends Filter
{
    public function fieldItems()
    {
        return [
            'featured' => [
                'type' => 'radio',
                'options' => [
                    'featured' => __('Featured'),
                    'not_featured' => __('Not Featured'),
                ]
            ]
        ];
    }

    public function apply($query, $values)
    {
        $query->where('featured', $values['featured'] === 'featured');
    }

    public function badge($values)
    {
        return $values['featured'] === 'featured'
            ? __('is featured')
            : __('not featured');
    }

    public function visibleTo($key)
    {
        return $key === 'entries';
    }
}

The fieldItems method lets you define which filter fields will be displayed, just like a field inside a Blueprint.

The apply method works exactly as it would in a standard scope.

The badge method lets you define the badge text to be used when the filter is active on a listing.

The visibleTo method allows you to control in which listings this filter will be displayed. You will be given a key that represents the type of listing. For example, an author filter might be appropriate for the entries listing but not users. You may also be given an array of contextual data which will vary depending on the listing. For instance, the entries listing will also provide the collection.

You may also pin your filters to the right side of the search bar by setting the $pinned class property:

public $pinned = true;
Betterify this page on Github!