В 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 будут применены только непустые фильтры. Пустое значение фильтра будет обозначать "все записи". Вы можете создавать любое количество фильтров в формате ['атрибут' => 'значение']. Если значение атрибута не задано или пустое, он будет проигнорирован при построении запроса. Если все фильтры пустые, будет выполнен запрос на получение всех записей.
Обратите внимание, что в приведенном примере фильтры применяются по атрибутам моделей. Если вам нужно сделать сложные многоуровневые фильтры или фильтры по связанным данным, вам может потребоваться немного изменить пример для вашего конкретного случая.