Yii动态下拉 - 昂贵的查询

时间:2011-06-08 21:54:47

标签: php mysql drop-down-menu yii

我有一个Yii下拉列表,它加载了一个城市,州,拉链码,纬度和经度表。加载状态下拉列表时,它需要永远。有没有办法加快查询速度以减少页面加载时间?我已经包含了我的观点:

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

该表是41,000个条目。在listData()中设置$ groupField似乎没有给出任何明显的改进。

4 个答案:

答案 0 :(得分: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/ 它只会在输入和匹配您感兴趣的数据时为您提供结果。

答案 1 :(得分:1)

不加载41k条目并将它们放在HTML <option>标签中似乎是一个非常好的开始......: - )

仅使用AJAX加载您需要的那些。

答案 2 :(得分:1)

状态下拉列表是否从该表中剔除了唯一的状态,即最终得到50个结果?您可能希望手动构建查询并查看瓶颈所在。对于复杂查询,这通常比使用AR快得多,我假设您正在使用AR来创建模型。我还假设你试图将41k记录加载到下拉列表中。

我们可能需要更多关于表格结构,如何创建模型等的详细信息。

答案 3 :(得分: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 --')
        );

我退回到这里,但这显着减少了负荷。