2014-06-09 93 views
0

我使用搜索症狀表,並將症狀代碼傳遞給我的疾病控制器Yii如何使用查詢結果搜索模型(填充activedataprovider)?

症狀和疾病都有模型類,但連接2的表沒有。

我使用這個查詢來查找所有具有特定症狀

  $diseaseCodes = Yii::app()->db->createCommand() 
        ->select ('ICD10') 
        ->from('tbl_disease') 
        ->join('tbl_symptom_disease', 'tbl_disease.ICD10=tbl_symptom_disease.diseaseCode') 
        ->where('symptomCode=:symptomCode', 
          array(':symptomCode'=>$_GET['symptomCode'])) 
        ->queryAll(); 

現在我想知道我可以用它來填充數據提供程序來填充一個gridview

一個想法的疾病我曾是創建一個自定義模式功能

public function queryResultSearch($diseaseArray) 
{ 
    $criteria=new CDbCriteria; 

    $criteria->compare('ICD10',$diseaseArray,true); 

    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
    )); 
} 

,並以此來渲染警予的管理動作(疾病模型),但我不能讓它工作,因爲可能我的恩在這樣做的輪胎方式是錯誤的。

有人可以幫我嗎?如何使用mysql查詢結果填充activedataprovider對象。

謝謝您的時間

回答

1

在你的控制器動作,你可以試試這個:

$model=new ModelName('search'); 
    $model->unsetAttributes(); 

    if(isset($_GET['ModelName'])) 
     $model->attributes=$_GET['ModelName']; 

    $diseaseCodes = Yii::app()->db->createCommand() 
     ->select ('ICD10') 
     ->from('tbl_disease') 
     ->join('tbl_symptom_disease', 'tbl_disease.ICD10=tbl_symptom_disease.diseaseCode') 
     ->where('symptomCode=:symptomCode', 
       array(':symptomCode'=>$_GET['symptomCode'])) 
     ->queryAll(); 

    $diseaseArray=array(); 
    foreach ($diseaseCodes as $dc) { 
     $diseaseArray[]=$dc['ICD10']; 
    } 

    $criteria=new CDbCriteria; 
    $criteria->compare('ICD10',$diseaseArray,true); 

    $dataProvider = new CActiveDataProvider(get_class($model),array('criteria'=>$criteria)); 
    $dataProvider->criteria->mergeWith($model->search()->criteria); 
    $this->render('view',array(
      'model'=>$this->loadModel($id), 
      'dataProvider'=> $dataProvider, 
      )); 
+0

感謝它工作:)。只需要注意一點:您忘記了一些無用的代碼(可能來自複製粘貼):「返回新的CActiveDataProvider($ this,array( 'criteria'=> $ criteria, ));」我還有一個問題,爲什麼我應該直接使用「get_class($ model)」而不是類名? –

+0

我已經刪除了返回:D ...從複製/粘貼....我使用的get_class,因爲您需要將對象發送給CActiveDataProvider作爲第一個參數,並且在您的代碼中使用$ this,因爲您的函數是在模型內寫入的類)並且不需要使用get_class – TotPeRo

0

你將要使用CArrayDataProvider。這是不太理想..和你將必須實現你所有的排序和分頁自己

你好得多使用模型和實現一個類似於

public function queryResultSearch($diseaseArray) 
{ 
    $criteria=new CDbCriteria; 
    $criteria->compare('ICD10',$diseaseArray,true); 
    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
    )); 
} 

爲了使您的第一款車型我會親自使用Gii。

+0

使用型號爲你的意思是臨時表?我有一個症狀模型與'症狀Diseases'=>數組(self :: HAS_MANY,'SymptomDisease','症狀代碼'),關係和疾病模型與'症狀Diseases'=>數組(self :: HAS_MANY,'SymptomDisease'疾病代碼「)關係。臨時表(tbl_symptom_disease)沒有模型(當然所有使用gii製作的模型) –