OctoberCMS. Backend фильтрация по разным полям базы данных
Задача
Имеется таблица «Публикации» со следующей упрощённой структурой.
Schema::create('publications', function(Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id'); // Incrementing ID (primary key)
$table->string('title', 350);
$table->boolean('is_wos')->default(false);
$table->boolean('is_scopus')->default(false);
$table->boolean('is_risc')->default(false);
$table->boolean('is_vak')->default(false);
$table->timestamps();
});
Задача заключается в создании одного backend list фильтра, который будет выбирать записи исходя из разных полей базы данных, в данном случае is_wos
, is_scopus
, is_risc
, is_vak
.
Решение
Конфигурационный файл для фильтрации списка config_filter.yaml
# ===================================
# Filter Scope Definitions
# ===================================
scopes:
indexation_type:
label: Индексация
type: group
scope: ofIndexationTypes
modelClass: <plugin_author>\<plugin_name>\Models\Publication
options:
wos: 'Wed of Science'
scopus: Scopus
risc: РИНЦ
vak: ВАК
Scope в модели Publication.php
/**
* Фильтрация публикаций по типам индексации
*
* @param Builder $query
* @param array $types wos | scopus | risc | vak
* @return Builder
*/
public function scopeOfIndexationTypes(Builder $query, array $types): Builder
{
foreach ($types as $type) {
switch ($type) {
case 'wos':
$query = $query->orWhere('is_wos', 1);
break;
case 'scopus':
$query = $query->orWhere('is_scopus', 1);
break;
case 'risc':
$query = $query->orWhere('is_risc', 1);
break;
case 'vak':
$query = $query->orWhere('is_vak', 1);
break;
}
}
return $query;
}
Результат
В итоге получается то, что необходимо: один фильтр отправляющий запросы к разным полям.