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

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

Собственные сообщения об ошибках валидации форм OctoberCMS

Во время разработки модели данных OctoberCMS при необходимости, можно использовать собственные сообщения об ошибках валидации полей формы вместо сообщения The :attribute field is required. по-умолчанию. В статье показывается как, достаточно просто, это делается.