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

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

FrontEnd контроллеры в OctoberCMS

В OctoberCMS нет концепции frontEnd контроллеров. Иными словами, идеология этой CMS не подразумевает возможность просто создать некий ProductController с несколькими action для обслуживания маршрутов Route::method('product/{id}', 'ProductController@show'). Вместо этого предлагается использовать компоненты плагинов. Именно компоненты являются формой frontEnd контроллеров.