web-dev-qa-db-fra.com

Yii2 Comment fonctionne search () dans SearchModel?

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.

27
Mr Goobri

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éthode formName() 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, '').

35
soju

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,
   ]);
}
0
user3410311