2015-07-31 31 views
7

Szukam ustawienia warunku tylko dla pojedynczej akcji w kontrolerze, więc nie chcę zmieniać mojego modelu search.Ustawienie warunku, w którym będzie używany dostawca danych w konkretnej metodzie sterownika

Mój kod wygląda następująco:

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

commmented wiersz pokazuje mój stan ($searchModel->query()->where('role <> regular');), to całkiem proste, ale nie znalazłem rozwiązanie, które działa w Internecie.

Dla porównania Próbowałem te:

Odpowiedz

2

można spróbować w ten sposób

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

w poszukiwaniu modelu

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

Drugi sposób przekazać drugi parametr jak:

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

W modelu wyszukiwania

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

Innym sposobem przekazać inne parametry jak jednak problemu w czasie filtra:

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

I tylko tak daleko (mają pójść na lunch, spróbuje później resztę) przetestować twój ostatni, który zwraca każdy wpis z 'rolą'' zwykły'. Przedstawię resztę. – Spurious

+1

Nie chcę modyfikować modelu, ponieważ używam go w wielu miejscach i jest to tylko jeden widok, więc wszelkie zmiany w modelu są denerwujące. – Spurious

0

Można spróbować to:
SearchModel:

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


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

Proszę również odwiedzić ten link: http://www.yiiframework.com/doc-2.0/guide-output-data-providers.html

+0

To zwraca: 'Notatka PHP - yii \ base \ ErrorException Niezdefiniowana zmienna: zapytanie' – Spurious

+0

zawiera również "zapytanie" => $ zapytanie w sekcji przekierowania –

+0

Nie działa, ponieważ zapytanie $ nie jest zdefiniowanym modelem. – Spurious

10

Ok, mam to zrobić, to działa w ten sposób dla mnie:

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 trochę skomplikowane, a zrobienie tego w modelu byłoby prawdopodobnie lepsze, ale chcę tylko, aby użył go w tej akcji i miał kilka innych akcji z tym samym modelem, ale w innych warunkach.

0

Spróbuj tego rozwiązania

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

można to zrobić w ten sposób w kontrolerze

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

Spróbuj jak to przy użyciu multi-params -

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