Est-ce que quelqu'un peut expliquer comment fonctionne la méthode search
dans un Yii2 SearchModel
? Je l'ai généré en utilisant Gii. C'est ici:
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;
}
Voici comment je l'appelle:
$search = new MyModelSearch();
$myModels = $search->search(['att3' => '3']);
Quels que soient les attributs que j'utilise pour appeler search
, je récupère toujours le même résultat, c'est-à-dire toutes les entrées du tableau. Il me manque quelque chose ici que je ne comprends tout simplement pas.
Toute aide sera grandement appréciée. Merci.
La fonction search()
générée par Gii utilise ActiveRecord::load()
pour définir les paramètres de recherche:
load()
obtient le'FormName'
de la méthodeformName()
du modèle (que vous pouvez remplacer), sauf si le paramètre$formName
est donné. Si le nom du formulaire est vide,load()
remplit le modèle avec l'ensemble de$data
, Au lieu de$data['FormName']
.
Vous devriez donc essayer:
$myModels = $search->search(['MyModelSearch'=>['att3'=>3]]);
Ou
$myModels = $search->search([$search->formName()=>['att3'=>3]]);
Et bien sûr, ajoutez une condition sur l'attribut att3
Dans la fonction search()
:
$this->addCondition($query, 'att3');
Mais si vous voulez vraiment utiliser $myModels = $search->search(['att3' => '3']);
, vous devez simplement remplacer $this->load($params)
par $this->load($params, '')
.
Si vous voulez que certains paramètres supplémentaires passent à la méthode search (), vous pouvez changer la méthode de recherche comme celle-ci dans SomeSearch.php:
public function search($params, $additional=0)
{
//...
if($additional==1) {
$query->andWhere(['status'=>['some', 'other']);
}
}
et à l'intérieur du contrôleur:
public function actionIndex()
{
$searchModel = new AdminSearch();
$additional=1;
$dataProvider = $searchModel->search(Yii::$app->request->queryParams, $additional);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}