2011-06-08 54 views
0

我有一個Yii下拉菜單,它載入城市,州,郵政編碼,經緯度和長度表。加載狀態下拉時,它需要永久。有沒有辦法加快查詢,以減少頁面加載時間?我已經包含了我的觀點:Yii動態下拉菜單 - 昂貴的查詢

echo $form->dropDownList($model,'State', CHtml::listData(Zipcodes::model()->findAll(), 
'State', 'State', 'State'), array('empty'=>'-- Choose State --')); 

該表是41,000個條目。在listData()中設置$ groupField似乎沒有給出任何明顯的改進。

回答

1

使用CDbCriteria,我設置了「GROUP BY」的查詢:

$stateGroupBy = new CDbCriteria; // i got that bitch criteria. bitches love criteria! 
$stateGroupBy->group = 'State'; // group by state 
echo $form->dropDownList($model, 'State', CHtml::listData(Zipcodes::model()->findAll($stateGroupBy), 'State', 'State'), 
     array('ajax' => 
      array(
        'type'=>'POST', //request type 
        'url'=>CController::createUrl('search/dynamiccities'), #we don't have to use search/, we could just say dynamiccities 
        'update'=>'#Zipcodes_City', 
        /*'data'=>'js:jQuery(this).serialize()'*/ 
       ), 
      'empty'=>'-- Choose State --') 
     ); 

我又回到了這個累昏了,但是這顯著削減負荷。

1

不加載項41K並將其放置在HTML標籤<option>似乎是一個很好的開始... :-)

只有加載這些你需要使用AJAX。

1

狀態下拉是從該表中剔除唯一狀態,即您最終得到的結果是50個?您可能想要手動構建查詢並查看瓶頸位置。對於複雜的查詢,這通常比使用AR的速度快得多,我假設您使用AR來創建模型。我還假設你是而不是試圖將41k條記錄加載到下拉列表中。

我們可能需要對錶的結構更詳細一點,你是如何創建模型等

3

我認爲你可以有兩種方式:

1)使用高速緩存(長或沒有過期時間,因爲你擁有的這些數據不是動態的)。 首次加載時間不會改變,但在此之後,它會更快,因爲緩存已經被保存了。 http://www.yiiframework.com/doc/guide/1.1/en/caching.data#query-caching

$zipcodes = Zipcodes::model()->cache(3600*24*7)->findAll(); //cache for a week 
  • 使用你需要編輯你的config/main.php文件緩存
//... 
'components' => array(
    //... 
    'cache'=>array( 
     'class'=>'system.caching.CFileCache', 
     //'class'=>'system.caching.CDummyCache', 
     //other cache class 
    ), 
    //... 
), 
//... 

2)可能考慮嘗試CJuiAutoComplete http://www.yiiframework.com/doc/api/1.1/CJuiAutoComplete/ 它將會給你onl的結果y打字並匹配您感興趣的數據。