Подтвердить что ты не робот

Yii2 Как работает поиск() в SearchModel?

Пожалуйста, объясните, как работает метод search в Yii2 SearchModel? Я сгенерировал его с помощью Gii. Вот он:

public function search($params){
    $query = MyModel::find();
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $this->addCondition($query, 'att1');
    $this->addCondition($query, 'att1', true);
    $this->addCondition($query, 'att2');
    $this->addCondition($query, 'att2', true);

    return $dataProvider;
}

Вот как я его называю:

$search = new MyModelSearch();
$myModels = $search->search(['att3' => '3']);

Независимо от того, какие атрибуты я использую при вызове search, я всегда возвращаю тот же результат, т.е. все записи в таблице. Мне не хватает чего-то здесь, что я просто не понимаю.

Любая помощь будет действительно оценена. Спасибо.

4b9b3361

Ответ 1

Функция search(), сгенерированная Gii, использует ActiveRecord::load() для установки параметров поиска:

load() получает 'FormName' из метода модели formName() (который вы можете переопределить), если не указан параметр $formName. Если имя формы пуст, load() заполняет модель целым числом $data вместо $data['FormName'].

Итак, вы должны попробовать:

$myModels = $search->search(['MyModelSearch'=>['att3'=>3]]);

или

$myModels = $search->search([$search->formName()=>['att3'=>3]]);

И, конечно, добавьте условие в атрибут att3 в search():

$this->addCondition($query, 'att3');

Но если вы действительно хотите использовать $myModels = $search->search(['att3' => '3']);, вы должны просто заменить $this->load($params) на $this->load($params, '').