2017-09-03 12 views
0

大学院生id(grad_id)、資格、監督者の3つの列を持つテーブルがあります。課題は、各監督者がさまざまな資格(博士号、修士号、PGD、その他および合計)について何人いるかを見つけることです。問題は、テーブルビューを生成した後、管理者の名前を除外して、さまざまな資格カテゴリごとに管理する学生の数を確認できないことです。ビュー内のYii2 GridViewで条件付きでグループ化されたデータをフィルタリングする方法

私のGridViewには、次のようになります。以上により

GridView::widget([ 
    'dataProvider' => $sup, 
    'filterModel' => $searchModel, 
     'columns' => [ 
['class' => 'yii\grid\SerialColumn'], 
     'supervisor', 
     'total', 
     'phd', 
     'masters', 
     'pgd', 
     'other', 
    ], 
]) 

、私はテーブルを生成することができますよ。 .../index.php?SupervisionSearch%5Bsupervisor%5D=david&SupervisionSearch%5Btotal%5D=&SupervisionSearch%5Bphd%5D=&SupervisionSearch%5Bmasters%5D=&SupervisionSearch%5Bpgd%5D=&r=student%2Fgrad-admissions%2Fsupervision

をSupervisionSearchクラスでは、私が試してみました:ページが更新されると(私はデビッドを検索したとき)のようなものにページのWeb URLが変更にもかかわらず、しかし、フィルタは、テーブルの内容を変更しない

public $supervisor; 
public $phd; 
public $masters; 
public $pgd; 
public $other; 
public $total; 

public function rules() 
    { 
     return [ 
      [['supervisor','phd', 'masters', 'pgd', 'other', 'total'], 'safe'], 
      [['phd', 'masters', 'pgd', 'other', 'total'], 'number'], 
      [['supervisor'], 'string'], 
     ]; 
    } 


    public function scenarios() 
    { 
     // bypass scenarios() implementation in the parent class 
     return Model::scenarios(); 
    } 


    public function search($params) 
    { 
$query = (new \yii\db\Query()) 
->select(["supervisor, sum(qualification = 'PhD') as phd", "sum(qualification = 'Masters') as masters", "sum(qualification = 'PGD') as pgd", "sum(qualification <> 'PhD' and qualification <> 'Masters' and qualification <> 'PGD')as other", "count(grad_id) as total"]) 
-> from('grad_students') 
-> where("supervisor <> ''") 
-> orderBy('total desc') 
-> groupBy('supervisor'); 

    $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
     ]); 
     $this->load($params); 
     if (!$this->validate()) { 
      // uncomment the following line if you do not want to return any records when validation fails 
      // $query->where('0=1'); 
      return $dataProvider; 
     } 

    $query->andFilterWhere(['like', 'supervisor', $this->supervisor]); 
    return $dataProvider; 
    } 

特定の管理者名を検索し、各資格カテゴリについて監督する学生の数を表示するために、フィルタを入手する際に助けが必要です。前もって感謝します。

答えて

2

あなたが代わりにwhere

public function search($params) 
{ 
$query = (new \yii\db\Query()) 
->select(["supervisor, sum(qualification = 'PhD') as phd", 
    "sum(qualification = 'Masters') as masters", 
    "sum(qualification = 'PGD') as pgd", 
    "sum(qualification <> 'PhD' 
     and qualification <> 'Masters' 
     and qualification <> 'PGD') as other", "count(grad_id) as total"]) 
-> from('grad_students') 
->andFilterWhere(['like', 'supervisor', $this->supervisor]) 
-> orderBy('total desc') 
-> groupBy('supervisor'); 
..... 

andFilterWhereを使用することができますし、あなたがモデル内の列の宣言を削除する必要がありますあなたの検索機能 ..あなたはとてもpublic $supervisor;

をコメントしてみてくださいのみ計算された列の別名を宣言shoul

それ以外の場合は、元の値を非表示(再定義)して動作しません。

+0

ありがとうScaisEdge、私は 'where'の代わりに' andFilterWhere'を使用しようとしましたが、フィルタはまだ動作しません。 –

+0

答えが更新されました。try comment // public $ supervisor;あなたの検索モデルで – scaisEdge

+0

ありがとう、もう一度、私は 'public $ supervisor;'とコメントしましたが、それでもうまくいきませんでした。しかし、私は以下の答えとして投稿していることを回避するような仕事を試みました。 –

0

私は一種の解決策で解決策を得ました。私は問題が元の質問に主キーがないことと関係していると思います。私が今やったことは、最初にデータベースにビューを作成しました。データベースのビューには主キーもありませんでした。次に、元のテーブルの代わりにビューを使用して、GIIでモデルを生成しました。次に、モデルにprimaryKey関数を置き、GII CRUDを使用して検索フィルタが完全にうまく機能する必要な検索モデルを生成しました。

public static function primaryKey(){ 
return 'supervisor'; 
} 
:これは私が主キーを取得するためにSupervisorCountモデルに含める必要がありましたコードがある

create view supervisor_count as select supervisor, sum(qualification = 'PhD') as phd, sum(qualification = 'Masters') as masters, sum(qualification = 'PGD') as pgd, sum(qualification <> 'PhD' and qualification <> 'Masters' and qualification <> 'PGD')as other, count(grad_id) as total from grad_students where supervisor <> '' group by supervisor order by count(grad_id) desc 

: これは(mysqlの使用phpmyadminのと)私はビューを生成するために使用するコードです

GII CRUDは主キーなしで実行できませんでした。そこで、私はモデルで上記のprimaryKey関数を使用しました。しかし、CRUDが生成されたとき、最初に表/index.php?r=student%2Fsupervisor-count%2Findexへのリンクが機能せず、エラー Getting unknown property: app\modules\student\models\SupervisorCount::pがスローされました。私はモデルに入れたprimaryKey関数を削除したGiiのモデルSupervisorCountジェネレータを再実行することでこれを解決しました。その後、リンクは正常に機能しました。生成されたSupervisorCountSearchモデルを使用しているGridViewに、各列(スーパーバイザ、Phd、マスタ、Pgd、その他、合計)で機能するフィルタが追加されました。

しかし、より良い解決策があるかどうか、またはsupervisor_countビューの代わりに元のテーブルgradstudentsをモデルに使用する解決策があるかどうかは疑問です。

関連する問題