2014-02-14 9 views
26

Bitte kann jemand erklären, wie die search Methode in einem Yii2 SearchModel funktioniert? Ich habe es mit Gii erstellt. Hier ist sie:Yii2 Wie funktioniert search() in SearchModel?

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

Dies ist, wie ich es nennen:

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

Unabhängig davon, welche Attribute ich in Aufruf search verwenden, habe ich immer das gleiche Ergebnis zurück - dh alle Einträge in der Tabelle . Mir fehlt hier etwas, was ich einfach nicht verstehe.

Jede Hilfe würde wirklich geschätzt werden. Vielen Dank.

Antwort

33

Die search() erzeugte Funktion von Gii Verwendung ActiveRecord::load() Suchparameter einzustellen:

load() bekommt die 'FormName' aus dem formName() Methode des Modells (die Sie außer Kraft setzen kann), es sei denn, der $formName Parameter angegeben ist. Wenn der Formularname leer ist, füllt load() das Modell mit dem gesamten $data statt $data['FormName'].

So sollten Sie versuchen:

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

Oder

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

Und natürlich eine Bedingung auf att3 Attribut in search() Funktion hinzufügen:

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

Aber wenn Sie wirklich möchte 0 benutzendann ersetzen Sie einfach $this->load($params) durch $this->load($params, '').

+1

Manchmal funktionieren einfache Lösungen; Das ist einer von ihnen! :) Funktioniert perfekt. –

+0

Ich frage mich, was ist der Unterschied zwischen Ihrem Code und mir: '$ search = new ModelSearch(); $ search-> att3 = 3; $ myDataProvider = $ search-> search (''); 'Ich bekomme auch das erwartete Ergebnis. –

Verwandte Themen