Фильтры



Фильтры служат для упрощения поиска записей с использованием типичного фильтра. Например, если вы хотите отфильтровать каталог продуктов по атрибутам, брендам и т.п. Выборка значений основана на параметрах Http запросов.

Это не является готовым решением или универсальным средством, вы должны расширить структуру для своих конкретных приложений.

Автоматическая HTTP фильтрация и сортировка

Для реагирования на HTTP параметры, модель должна включать в себя Filterable, а так же определение доступных атрибутов:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Orchid\Filter\Filterable;

class Post extends Model
{
    use Filterable;

    /**
     * @var array
     */
    protected $allowedFilters = [
        'id',
        'user_id',
        'type',
        'status',
        'content',
        'options',
        'slug',
        'publish_at',
        'created_at',
        'deleted_at',
    ];

    /**
     * @var array
     */
    protected $allowedSorts = [
        'id',
        'user_id',
        'type',
        'status',
        'slug',
        'publish_at',
        'created_at',
        'deleted_at',
    ];
}

Использование заключается в вызове метода filters:

Post::filters()->defaultSort('id')->paginate();

Как будет реагировать фильтрация:

http://example.com/demo?filter[id]=1
$model->where('id', '=', 1)

http://example.com/demo?filter[id]=1,2,3,4,5
$model->whereIn('id', [1,2,3,4,5]);

http://example.com/demo?filter[content.ru.name]=dwqdwq
$model->where('content->ru->name', '=', 'dwqdwq');

Как будет реагировать сортировка:

http://example.com/demo?sort=content.ru.name
$model->orderBy('content.ru.name', 'asc');

http://example.com/demo?sort=-content.ru.name
$model->orderBy('content.ru.name', 'desc');

Отличным способом будет использовать такую сортировку в таблицах, для того, что бы заголовки колонки стали активными используйте:

use Orchid\Screen\TD;

TD::set('name')->sort();

Классический фильтр

Для создания нового фильтра существует команда:

php artisan orchid:filter QueryFilter

Это создаст класс фильтр в папке app/Http/Filters

Пример фильтра:

namespace App\Http\Filters;

use Orchid\Filters\Filter;
use Illuminate\Database\Eloquent\Builder;

class QueryFilter extends Filter
{

    /**
     * @var array
     */
    public $parameters = ['query'];

    /**
     * @param Builder $builder
     *
     * @return Builder
     */
    public function run(Builder $builder): Builder
    {
        return $builder->where('demo', $this->request->get('query'));
    }

    /**
     * @return Field[]
     */
    public function display() : array
    {
        return [
            Input::make('email')
                ->type('text')
                ->value($this->request->get('email'))
                ->placeholder('Search...')
                ->title('Search')
        ];
    }
}

Фильтр сработает, при условии наличия хотя бы одного параметра указанного в массиве $parameters. Если массив будет пуст, то фильтр будет работать при каждом запросе.

Примечание. Вы можете использовать одни и те же фильтры для разных поведений.

Для использования фильтров в собственных моделях, требуется подключить трейт Orchid\Filter\Filterable и передавать в функцию filtersApply массив классов:

use App\Model;

Model::filtersApply([Filter::class])->simplePaginate();

Возможно использование целой группы фильтров объединённых в слой Selection:

Model::filtersApplySelection(RoleSelection::class)->simplePaginate();

Тогда все фильтры установленные в слое будут применены.