2016-04-22 3 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; 
    } 
} 

そして、私はこれでActiveDataProviderを(SQLDataProviderを使用していないよので、私は、フィルタルールを追加することはできませんあなたが最後に使うもの$query->andFilterWhere(...)

ありがとうございました

+1

sqlをsqlビューに囲み、そのsqlビューからモデルを作成できます。その後、そのデータにActiveDataProviderを適用します。 –

答えて

0

(非常に快適ではなく)もっと簡単な方法は、「andFilterWhereの行動をエミュレートです:

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

これは、すべてのフィルタのフィールドに対して繰り返さなければなりません。