2016-03-24 4 views
1

にこのSQLを使用するためにどのように私は現在、このSQLCDbCriteria

SELECT 


     MAX(CASE WHEN uv.user_type_variables_id = 1 THEN uv.value ELSE NULL END) Question1, 
     MAX(CASE WHEN uv.user_type_variables_id = 2 THEN uv.value ELSE NULL END) Question2, 
     MAX(CASE WHEN uv.user_type_variables_id = 3 THEN uv.value ELSE NULL END) Question3, 
     MAX(CASE WHEN uv.user_type_variables_id = 4 THEN uv.value ELSE NULL END) Question4, 
     MAX(CASE WHEN uv.user_type_variables_id = 5 THEN uv.value ELSE NULL END) Question5, 
     MAX(CASE WHEN uv.user_type_variables_id = 6 THEN uv.value ELSE NULL END) Question6 

     FROM tbl_event_attendees AS ea 

     LEFT JOIN tbl_user AS u ON ea.user_id = u.id 
     LEFT JOIN tbl_event AS e ON ea.event_id = e.id     
     LEFT JOIN tbl_user_variables AS uv on u.id = uv.user_id 

     GROUP BY ea.id 

を持っていると私は関係を拡張し、私の既存のCDbCriteria +にそれを配置する必要があります。各質問1〜6は、私がcgridviewの中に入れるために使うことができる変数にする必要がありますが、私はそれを動作させるのに苦労しています。 CSQLdataproviderを使うとうまくいきますが、すでに持っている既存の基準が必要です。

私の現在の基準

public function search() { 
     // Warning: Please modify the following code to remove attributes that 
     // should not be searched. 

     $criteria = new CDbCriteria; 

     $criteria->compare('id', $this->id, true); 
     $criteria->compare('event_id', $this->event_id, true); 
     $criteria->compare('status_id', $this->status_id, true); 
     $criteria->compare('checkin_status_id', $this->checkin_status_id, true); 
//  $criteria->compare('guest_invites', $this->guest_invites, true); 
     $criteria->compare('guest_of_user_id', $this->guest_of_user_id, true); 
     $criteria->compare('user_id', $this->user_id, true); 
     $criteria->compare('assign_group', $this->assign_group, true); 

//  $criteria->with = 'eventAttendeesGroup'; 
     $criteria->with = 'user'; 
     $criteria->compare('user.forename', $this->user_forename, true); 
     $criteria->compare('user.surname', $this->user_surname, true); 
     $criteria->compare('user.company', $this->user_company, true); 
     $criteria->compare('user.telephone', $this->user_telephone, true); 
     $criteria->compare('user.dob', $this->user_dateofbirth, true); 

     //need to get rid of this 
     $criteria->compare('userVariables.value', $this->userType_value, true); 

     $criteria->order = 'user.surname ASC'; 

     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, 
      //manages the pagination and how many users appear on the onsite reg page 
      'pagination'=>array('pageSize'=>50), 
      //'pagination'=>false, 
     )); 
    } 

誰もが任意のアイデアを得ましたか。

私は各質問に変数を設定して、それらをusertype.variableや$ this->変数のような関係に追加する必要があると推測します。

編集。

私は

 function newsearch(){ 
    $rawData=Yii::app()->db->createCommand('SELECT 


        MAX(CASE WHEN uv.user_type_variables_id = 1 THEN uv.value ELSE NULL END) Question1, 
        MAX(CASE WHEN uv.user_type_variables_id = 2 THEN uv.value ELSE NULL END) Question2, 
        MAX(CASE WHEN uv.user_type_variables_id = 3 THEN uv.value ELSE NULL END) Question3, 
        MAX(CASE WHEN uv.user_type_variables_id = 4 THEN uv.value ELSE NULL END) Question4, 
        MAX(CASE WHEN uv.user_type_variables_id = 5 THEN uv.value ELSE NULL END) Question5, 
        MAX(CASE WHEN uv.user_type_variables_id = 6 THEN uv.value ELSE NULL END) Question6 

        FROM tbl_event_attendees AS ea 

        LEFT JOIN tbl_user AS u ON ea.user_id = u.id 
        LEFT JOIN tbl_event AS e ON ea.event_id = e.id     
        LEFT JOIN tbl_user_variables AS uv on u.id = uv.user_id 

        GROUP BY ea.id')->queryAll(); 
// or using: $rawData=User::model()->findAll(); 
return $dataProvider=new CArrayDataProvider($rawData, array(
    'id'=>'Questions', 
    'sort'=>array(
     'attributes'=>array(
      'Question1', 'Question2', 'Question3', 
     ), 
    ), 
    'pagination'=>array(
     'pageSize'=>10, 
    ), 
)); 

は、グリッド内のSQLを表示するには得ることができますが、私はまだこれと一緒に私のモデルデータにアクセスすることはできません。

+0

実際にCDbCriteriaを使用したいのですが、それを実装することは可能ですが、CDbCommandを使用してカスタムクエリを書く方が簡単かもしれません。 CArrayDataProviderを使用してください – Tim

+0

これは継承したプロジェクトなので、この機能にはあまりにも多くの依存関係があります。私は2つのデータプロバイダを一緒に配列として追加したり結合したりすることを考えましたが、SQLデータとモデルからのデータが検索/エクスポートを使用するときに全くリンクしていないので、結果を得ることができませんでしたのデータ。 – DevAL

+0

私はこれが役立つ場合は私に答えを追加しました。 – Tim

答えて

0

私は完全にそれをテストしていません。しかし、モデルクラスに属性を追加して、クエリの選択文をCDbCriteria(select)属性に追加し、together属性を使用してクエリを一度に実行する必要があります。

私は、これは我々が見つけたいくつかのテストは、問題がクエリではありませんでした後、正しくYiiのが自動に

class tblEventAttendees extends CActiveRecord { 

public $Question1; 
public $Question2; 
public $Question3; 
public $Question4; 
public $Question5; 
public $Question6; 

... 


    public function search() { 
     // Warning: Please modify the following code to remove attributes that 
     // should not be searched. 

     $criteria = new CDbCriteria; 
     $criteria->select = [ 
      't.*', 
      'user.*', 
      'MAX(CASE WHEN uv.user_type_variables_id = 1 THEN uv.value ELSE NULL END) Question1', 
      'MAX(CASE WHEN uv.user_type_variables_id = 2 THEN uv.value ELSE NULL END) Question2', 
      'MAX(CASE WHEN uv.user_type_variables_id = 3 THEN uv.value ELSE NULL END) Question3', 
      'MAX(CASE WHEN uv.user_type_variables_id = 4 THEN uv.value ELSE NULL END) Question4', 
      'MAX(CASE WHEN uv.user_type_variables_id = 5 THEN uv.value ELSE NULL END) Question5', 
      'MAX(CASE WHEN uv.user_type_variables_id = 6 THEN uv.value ELSE NULL END) Question6', 
      // add what you need 
     ]; 

     $criteria->compare('id', $this->id, true); 
     $criteria->compare('event_id', $this->event_id, true); 
     $criteria->compare('status_id', $this->status_id, true); 
     $criteria->compare('checkin_status_id', $this->checkin_status_id, true); 
//  $criteria->compare('guest_invites', $this->guest_invites, true); 
     $criteria->compare('guest_of_user_id', $this->guest_of_user_id, true); 
     $criteria->compare('user_id', $this->user_id, true); 
     $criteria->compare('assign_group', $this->assign_group, true); 

//  $criteria->with = 'eventAttendeesGroup'; 
     $criteria->compare('user.forename', $this->user_forename, true); 
     $criteria->compare('user.surname', $this->user_surname, true); 
     $criteria->compare('user.company', $this->user_company, true); 
     $criteria->compare('user.telephone', $this->user_telephone, true); 
     $criteria->compare('user.dob', $this->user_dateofbirth, true); 

     //need to get rid of this 
     $criteria->compare('userVariables.value', $this->userType_value, true); 

     $criteria->order = 'user.surname ASC'; 

     $criteria->with = array('user','event','userVariables'); 
     $criteria->together = true; 

     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, 
      //manages the pagination and how many users appear on the onsite reg page 
      'pagination'=>array('pageSize'=>50), 
      //'pagination'=>false, 
     )); 
    } 

UPDATE

レコードを移入します使用tbl_event_attendeesモデル、であると仮定しますしかし、エイリアスの使用法では。 Yiiはエイリアスを使用してクエリの結果をマッピングし、エイリアスが

https://github.com/yiisoft/yii/blob/1.1.17/framework/db/ar/CActiveFinder.php#L954だから、このために、この

$criteria->select = [ 
    't.*', 
    'user.*', 
    'MAX(CASE WHEN uv.user_type_variables_id = 1 THEN uv.value ELSE NULL END) Question1', 
    'MAX(CASE WHEN uv.user_type_variables_id = 2 THEN uv.value ELSE NULL END) Question2', 
    'MAX(CASE WHEN uv.user_type_variables_id = 3 THEN uv.value ELSE NULL END) Question3', 
    'MAX(CASE WHEN uv.user_type_variables_id = 4 THEN uv.value ELSE NULL END) Question4', 
    'MAX(CASE WHEN uv.user_type_variables_id = 5 THEN uv.value ELSE NULL END) Question5', 
    'MAX(CASE WHEN uv.user_type_variables_id = 6 THEN uv.value ELSE NULL END) Question6', 
    // add what you need 
]; 

は、問題を解決した変更を参照するpreg_match機能を使用してクエリから抽出された

$criteria->select = [ 
    't.*', 
    'user.*', 
    'MAX(CASE WHEN uv.user_type_variables_id = 1 THEN uv.value ELSE NULL END) AS Question1', 
    'MAX(CASE WHEN uv.user_type_variables_id = 2 THEN uv.value ELSE NULL END) AS Question2', 
    'MAX(CASE WHEN uv.user_type_variables_id = 3 THEN uv.value ELSE NULL END) AS Question3', 
    'MAX(CASE WHEN uv.user_type_variables_id = 4 THEN uv.value ELSE NULL END) AS Question4', 
    'MAX(CASE WHEN uv.user_type_variables_id = 5 THEN uv.value ELSE NULL END) AS Question5', 
    'MAX(CASE WHEN uv.user_type_variables_id = 6 THEN uv.value ELSE NULL END) AS Question6', 
    // add what you need 
]; 
+0

残念ながら私はこれを動作させることができません。それは、私が見るべきことに関係なく、イベントテーブルを見ています。 usertype変数のように見えます。私は必要なすべての関係を追加しましたが、まだ列を見つけることができないと言っています。私は自分のOPに一種の働くcdatarrayproviderを追加しましたが、私はまだモデルデータにアクセスできます。 – DevAL

+0

エラー全体を表示し、コードを更新できましたか? – Tim

+0

アクティブなレコード "EventAttendees"が無効な列 "MAX(CASE WHEN userTypeVariables.user_type_variables_id = 1 THEN userTypeVariables.value ELSE NULL END)を選択しようとしています。列は表に存在するか、エイリアスを持つ式である必要があります。 なぜそれが列を見つけることができないのかわからないので、関係を認識しています – DevAL

0

MYSQL database viewを作成し、Yiiモデルで使用することをお勧めします。このアプローチでは、あなたの元のクエリと条件のから既存の機能を維持する(INSERT,UPDATE,DELETE操作を除く)他のテーブルベースのモデルのように、すべてのYiiモデルの機能を使用することができます。

CREATE OR REPLACE VIEW myviewname AS 
... your SQL ... 

データベースビューのMYSQL database view作成、make sure to create Yii model後。このモデルでは、既存のカスタムsearch()を使用してください。最後に、CGridView、レポートなどで、あなたのプログラムで使います。

関連する問題