Yiii2 comment search () fonctionne SearchModel?

s'il vous plaît quelqu'un peut expliquer comment le <!-Méthode dans un Yii2 SearchModel fonctionne? Je l'ai générée en utilisant Gii. Ici, c'est:

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;
}

C'est comment je l'appelle:

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

quels que soient les attributs que j'utilise pour appeler search, j'obtiens toujours le même résultat - c'est à dire toutes les entrées dans la table. Je suis absent quelque chose ici que je ne comprends pas.

Toute aide serait vraiment appréciée. Grâce.

27
demandé sur Mr Goobri 2014-02-14 16:11:26

2 réponses

search() fonction générée par Gii utiliser ActiveRecord::load() pour définir les paramètres de recherche :

load() devient 'FormName' à partir du modèle formName() méthode (que vous pouvez annuler), à moins que le $formName paramètre est donné. Si le nom du formulaire est vide, load() remplit le modèle avec la totalité de $data au lieu de $data['FormName'].

alors vous devriez essayer :

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

Ou

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

Et bien sûr d'ajouter une condition sur att3 l'attribut search() fonction :

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

Mais si vous voulez vraiment utiliser $myModels = $search->search(['att3' => '3']); alors vous devez simplement remplacer $this->load($params)$this->load($params, '').

34
répondu soju 2015-09-04 08:36:13

si vous voulez un param supplémentaire pour passer à la méthode search (), vous pouvez changer la méthode de recherche comme ceci dans SomeSearch.php:

public function search($params, $additional=0)
{
   //...
   if($additional==1) {
       $query->andWhere(['status'=>['some', 'other']);
   }
}
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
répondu user3410311 2018-06-08 06:18:16