2011-06-08 26 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打字并匹配您感兴趣的数据。