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;
    }

Результат

В итоге получается то, что необходимо: один фильтр отправляющий запросы к разным полям. filter-by-different-fields.png

Другие записи из подборки «OctoberCMS. Backend.»

OctoberCMS. Ошибка RelationController: "Не удалось найти шаблон (partial) ... traits\ViewMaker.php"

В контроллере поведения RelationController при нажатии на кнопке "Cоздание" вылетает ошибка с подобным содержаним

"Не удалось найти шаблон (partial) с именем _comments.htm." on line 91
of ...\modules\system\traits\ViewMaker.php

Похожие записи