2016-04-22 72 views
2

嗨每一个我有一个SQLDataProvider网格视图,我正在做ModelSearch。互联网上的每一个教程都与ActiveDataProvider,我不想使用ActiveRecord,因为我使用我的数据库的方式。Yii2网格视图筛选器sql

所以我的问题是:如何在MyModelSearch的搜索方法中添加过滤器?

这里我的代码:

控制器:

$queryTR = Yii::$app->db->createCommand(
      "select idTypeRessource, nomTypeRessource from type_ressource" 
     )->queryAll(); 

     $typeRessource = ArrayHelper::map($queryTR, 'idTypeRessource', 'nomTypeRessource'); 
     $searchModel = new RessourceSearch(); 
     $dataProvider = $searchModel->search(Yii::$app->request->get()); 
     $model  = $dataProvider->getModels(); 

     return $this->render('ressource', 
      [ 
       'dataProvider' => $dataProvider, 
       'searchModel' => $searchModel, 
       'model'   => $model, 
       'typeRessource' => $typeRessource, 
      ] 
     ); 

ModelSearch:

class RessourceSearch extends Ressource 
{ 
    public $nomRessource; 
    public $idTypeRessource; 
    public $idEtatRessource; 
    public $dateRecherche; 

    public function rules() 
    { 
     /*...*/ 
    } 

    public function search($param) 
    { 
     $query = "select idTypeRessource, nomRessource, nomTypeRessource, nomEtatRessource, 
      date_format(tr.dateDebut, '%d/%m/%Y %H:%i') as trDateDebut, 
      date_format(tr.dateFin, '%d/%m/%Y %H:%i') as trDateFin, 
      date_format(er.dateDebut, '%d/%m/%Y %H:%i') as erDateDebut, 
      date_format(er.dateFin, '%d/%m/%Y %H:%i') as erDateFin 
      from ressource 
      join historique_type_ressource tr using (idRessource) 
      join type_ressource using(idTypeRessource) 
      join historique_etat_ressource er using (idRessource) 
      join etat_ressource using (idEtatRessource)"; 

      $count = \Yii::$app->db->createCommand(
       "select count(*) from (" . $query . ") as req" 
      )->queryScalar(); 

      $dataProvider = new SqlDataProvider([ 
      'sql'  => $query, 
      'key'  => 'nomRessource', 
      'totalCount' => $count, 
      'pagination' => [ 
      'pageSize' => 15, 
      ], 
     ]); 

      $dataProvider->sort->attributes['nomRessource'] = [ 
     'asc' => ['nomRessource' => SORT_ASC], 
     'desc' => ['nomRessource' => SORT_DESC], 
    ]; 

     if (!($this->load($param) && $this->validate())) { 
      return $dataProvider; 
     } 
    return $dataProvider; 
    } 
} 

而且因为我使用的SqlDataProvider而不是ActiveDataProvider(我不能添加过滤规则与此最后一个你必须使用$query->andFilterWhere(...)

谢谢

+1

你可以将sql放在sql视图中,并从该sql视图创建模型。然后将ActiveDataProvider应用于该数据。 –

回答

0

更简单(但不是很舒服)的方式是模仿“andFilterWhere行为:

if (isset($param['your_field'])){ 
    $query .= " AND your_table.your_filed = '" . $param['your_field ."';" 
} 

这应该被重复的所有过滤器领域。