Фильтры данных
Расширение для класса отображения данных
Используются для фильтрации списка данных на основе параметров запроса. Являются разновидностью фильтрации данных, без использования формы.
Т.е., например, у вас есть таблица с новостями из различных категорий (category_id) и вы хотите отобразить новости из определенной категории:
$display = AdminDisplay::table()
->setFilters(
AdminDisplayFilter::field('category_id')->setTitle('Category ID [:value]')
)
->setColumns(
AdminColumn::link('title', 'Заголовок'),
AdminColumn::link('category', 'Категория'),
AdminColumn::datetime('created_at', 'Дата публикации')->setWidth('150px')
)->paginate(20);
В этом примере показан простейший пример применения фильтра. И если теперь в браузере указать ?category_id=1, то при формировании запроса для выборки данных в него будет вставлено условие where category_id = 1 и в заголовке таблицы будет отображена строка Category ID [1]
Типы фильтров:
- Фильтр по полю
- Фильтр по eloquent scopes
- Произвольный фильтр
API (Методы доступные во всех фильтрах)
setName
Указание ключа поля, по которому будет производиться фильтрация
SleepingOwl\Admin\Display\Filter\FilterBase::setName(string $name): return self
setAlias
Указание алиаса для поля, который будет использоваться вместо ключа поля для получение значения из запроса.
SleepingOwl\Admin\Display\Filter\FilterBase::setAlias(string $alias): return self
AdminDisplayFilter::field('category_id')->setAlias('category'); // ?category=1
setTitle
Указание заголовка в случае применения этого фильтра. Т.е. как только фильтр сработает, над списком результатов будет выведен заголовок для фильтра, если сработало несколько фильтров, то заголовки будут разделены знаком ` | `
SleepingOwl\Admin\Display\Filter\FilterBase::setTitle(\Closure|string $title): return self
AdminDisplayFilter::field('category_id')->setTitle('Category ID [:value]');
// or
AdminDisplayFilter::field('category_id')->setTitle(function($value) {
return "Category ID [{$value}]";
});
setValue
Принудительное указание значения для фильтрации. При указании значения фильтр не будет обращаться к параметрам запроса
SleepingOwl\Admin\Display\Filter\FilterBase::setValue(mixed $value): return self
AdminDisplayFilter::field('category_id')->setValue(1);
Фильтр по полю
Данный фильтр привязан к полю модели.
AdminDisplayFilter::field('category_id');
API
setOperator
Указание оператора сравнения. Помимо обычного сравнения вы можете указать как именно фильтр должен проверять значение.
SleepingOwl\Admin\Display\Filter\FilterBase::setOperator(string $operator): return self
equal-column = valuenot_equal-column != valueless-column < valueless_or_equal-column <= valuegreater-column > valuegreater_or_equal-column >= valuebegins_with-column like value%not_begins_with-column not like value%contains-column like %value%not_contains-column not like %value%ends_with-column like %valuenot_ends_with-column not like %valueis_empty-column = ''is_not_empty-column != ''is_null-column is nullis_not_null-column is not nullbetween-column between valuenot_between-column not between valuein-column in valuenot_in-column not in value
AdminDisplayFilter::field('category_id')->setOperator('in'); // ?category_id[]=1&category_id[]=2&category_id[]=5
Фильтр по eloquent scopes
Этот фильтр будет применять scope (eloquent scopes) к вашему запросу. Допустим вы выводите список новостей и хотите иметь возможность фильтровать ваши записи по scope, который имеется в модели App\Post, с помощью которой вы формируете список.
<?php
namespace App;
class Post extends Model
{
...
/**
* @param $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeLatest($query)
{
return $query->orderBy('created_at', 'desc');
}
/**
* @param $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeType($query, $type)
{
return $query->where('type', $type);
}
}
$display = AdminDisplay::table()
->setFilters(
AdminDisplayFilter::scope('latest'); // ?latest
AdminDisplayFilter::scope('type'); // ?type=news | ?latest&type=news
);
Произвольный фильтр
Используется в случае если вы хотите задать фильтр с произвольным запросом
AdminDisplayFilter::custom('custom_filter')->setCallback(function($query, $value) {
$query->where('myField', $value);
}); // ?custom_filter=test