Как в ActiveRecord правильно реализовать множественные фильтры, где пустое значение фильтра будет значить «все записи»?

В Yii фреймворке, для реализации множественных фильтров в ActiveRecord с возможностью использовать пустое значение фильтра для "всех записей", можно воспользоваться следующим подходом:

1. Создайте метод в вашей модели ActiveRecord, который будет принимать массив с фильтрами и возвращать объект запроса ActiveQuery. Допустим, назовем его search.


public function search($filters)
{
    // Начинаем с базового запроса ActiveRecord
    $query = self::find();

    // Итерируемся по фильтрам
    foreach ($filters as $attribute => $value) {
        // Если значение фильтра не пустое
        if (!empty($value)) {
            $query->andWhere([$attribute => $value]);
        }
    }

    // Возвращаем объект запроса ActiveQuery
    return $query;
}

2. В контроллере, где вы хотите применять фильтры, получите массив фильтров из входных данных. Например, в Yii можно использовать Yii::$app->request->get('filters') для получения массива параметров filters из GET запроса.

public function actionIndex()
{
    // Получаем массив фильтров из GET запроса
    $filters = Yii::$app->request->get('filters', []);

    // Создаем новый экземпляр модели ActiveRecord
    $model = new YourModel();

    // Применяем фильтры к запросу ActiveQuery
    $query = $model->search($filters);

    // Выполняем запрос
    $data = $query->all();

    // Далее ваш код для отображения результатов запроса
    // ...
}

Таким образом, в вашем запросе ActiveQuery будут применены только непустые фильтры. Пустое значение фильтра будет обозначать "все записи". Вы можете создавать любое количество фильтров в формате ['атрибут' => 'значение']. Если значение атрибута не задано или пустое, он будет проигнорирован при построении запроса. Если все фильтры пустые, будет выполнен запрос на получение всех записей.

Обратите внимание, что в приведенном примере фильтры применяются по атрибутам моделей. Если вам нужно сделать сложные многоуровневые фильтры или фильтры по связанным данным, вам может потребоваться немного изменить пример для вашего конкретного случая.