Всем хорошего дня) Подскажите, есть ли какое-то красивое решение, чтобы сделать несколько разных поисков по одной модели? Я сгенерировал в gii класс для поиска ApplicationsSearch, на его в контроллере я создаю DataProvider, но мне нужно создавать провайдер данных с разным условием выборки. Первый провайдер данных для открытых заявок (первая таблица грида) - статус = open, второй для закрытых - status = close и еще несколько провайдеров. решить задачу я пока смог двумя способами. Первый мне показался уместным, пока я не столкнулся с необходимостью создать третье условие выборки - я просто внутри самой модели поиска создаю несколько провайдеров данных, перебираю их в цикле и возвращаю массивом. Но когда появилась необходимость добавить третье условие выборки для третьего провайдера, это уже стало походить на нагромождение кода. Второй вариант решения проблемы - просто создать несколько отдельных файлов типа NewApplicationsSerch, CloseApplicationsSerch и так далее. Но возникает избыточность кода, хотя они все и наследуются от базовой модели Applications и их поддержка не трудна, но все же по сути это куча файлов с одинаковым кодом с той лишь разницей, что у них query (выборка данных) разная. И сейчас пока писал этот текст еще пришел в голову третий вариант - создать базовый класс поиска ApplicationsSearch и наследоваться от него, а в новых классах NewApplicationsSerch, CloseApplicationsSerch и так далее переопределять только свойство query. Вроде уже выглядит логичнее, но в то же время хочу услышать ваши советы, может кто подскажет, что-то дельное? ![]()
Пока что сделал, как в третьем варианте - добавил свойство $query, переопределяю метод search и внутри этого метода устанавливаю новое значение для $query.
<?php
namespace backend\modules\applications\models\search;
use backend\modules\applications\models\search\ApplicationsSearch;
use Yii;
use backend\modules\applications\models\Applications;
/**
* NewApplicationsSearch represents the model behind the search form about `backend\modules\applications\models\Applications`.
*/
class NewApplicationsSearch extends ApplicationsSearch
{
/**
* Creates data provider instance with search query applied*
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params)
{
// Переопределяем свойство query для вывода только новых заявок
$this->query = Applications::find()->where(['promo_id' => $params['promo_id'], 'open' => 0]);
return parent::search($params);
}
}