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
, я всегда возвращаю тот же результат, т.е. все записи в таблице. Мне не хватает чего-то здесь, что я просто не понимаю.
Любая помощь будет действительно оценена. Спасибо.
Ответы
Ответ 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, '')
.