2015-07-31 22 views
7

Sto cercando di impostare una condizione solo per una singola azione nel controller, quindi non voglio modificare il mio modello search.Impostare una condizione di condizione per dataprovider in un metodo di controllo specifico

Il mio codice è simile al seguente:

public function actionRoles() 
    { 
     $searchModel = new EmployeeSearch(); 
     //$searchModel->query()->where('role <> regular'); 
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

     return $this->render('view_role', [ 
      'searchModel' => $searchModel, 
      'dataProvider' => $dataProvider, 
     ]); 
    } 

La riga commmented mostra la mia condizione ($searchModel->query()->where('role <> regular');), è abbastanza semplice, ma non ho trovato una soluzione che funziona in linea.

Per riferimento ho provato quelli:

risposta

2

Si può provare in questo modo

$searchModel = new EmployeeSearch(); 
$searchModel->role = 'regular'; 
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

In Cerca modello:

$query->andFilterWhere(['<>', 'role', $this->role]); 

Secondo modo passare secondo parametro come:

$dataProvider = $searchModel->search(Yii::$app->request->queryParams, $role = 'regular'); 

Nel modello di ricerca

if($role == 'regular') { 
    $query->andWhere(['<>', 'role', $this->role]); 
} 

Un altro modo passare altri parametri come ma problema nel tempo di filtro:

$dataProvider = $searchModel->search(Yii::$app->request->queryParams+['EmployeeSearch' => ['<>', 'role' =>'regular']]); 
+0

ho soltanto finora (ho andare a pranzo, proverò dopo il resto) ha testato il tuo ultimo, che restituisce ogni voce con 'role'' regular'. Riferirò al resto. – Spurious

+1

Non voglio modificare il modello perché lo sto usando in molti posti e questa è solo una vista, quindi qualsiasi modifica al modello è fastidiosa. – Spurious

0

Si può provare questo:
SearchModel:

$searchModel = new EmployeeSearch(); 
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); 


    $query->andFilterWhere(['<>', 'role'=>'regular']); 
return $this->render('view_role', [ 
     'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 

Si prega di visitare anche questo link: http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html

+0

Restituisce: 'Avviso PHP - yii \ base \ ErrorException Variabile non definita: query' – Spurious

+0

include anche 'query' => $ query nella sezione di ritorno –

+0

Non funziona perché $ query non è un modello definito. – Spurious

10

Ok, ho capito fatto, funziona in questo modo per me:

public function actionRoles() 
{ 
    $searchModel = new EmployeeSearch(); 

    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 
    $dataProvider->sort = ['defaultOrder' => ['role'=>SORT_ASC, 'fullname'=>SORT_ASC]]; 
    $dataProvider->query->where('employee.role <> \'regular\''); 

    return $this->render('view_role', [ 
     'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 
} 

Ce un po 'complicato e farlo nel modello sarebbe probabilmente migliore, ma voglio solo usarlo in questa azione e avere un sacco di altre azioni con lo stesso modello search ma diverse condizioni.

0

Prova questa soluzione

$searchModel = new ModelnameSearch 
      (
       [ 'Attribute' => 1, 
       'SecondAttribte' => '1', 
       ] 
      ); 
7

Si può fare in questo modo nel controller

$searchModel = new ModelSearch(); 
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); 
$dataProvider->query->andWhere(['lang'=>'ENG']); 
0

Prova in questo modo utilizzando multi-params -

$searchModel = new YourSearchModel(); 
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); 
$dataProvider->query->where('field1 = :field1 AND field2 = :field2', [':field1' => 1, ':field2' => 'A']);