Yii Dynamic Dropdown - Дорогой запрос - PullRequest
0 голосов
/ 09 июня 2011

У меня есть выпадающий список Yii, который загружает таблицу городов, штатов, почтовых индексов, лат и долг. При загрузке состояния выпадающий список занимает вечность. Есть ли способ ускорить запрос, чтобы сократить время загрузки страницы? Я включил мой взгляд:

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

Таблица содержит 41 000 записей. Установка $ groupField в listData (), похоже, не принесла заметных улучшений.

Ответы [ 4 ]

3 голосов
/ 09 июня 2011

Я думаю, у вас может быть два пути:

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 голос
/ 20 июля 2011

Используя 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 голос
/ 09 июня 2011

Является ли раскрывающийся список состояний, отбирающий уникальные состояния из этой таблицы, т. Е. Вы получаете 50 результатов? Возможно, вы захотите создать запрос вручную и посмотреть, где находится узкое место. Для сложных запросов это часто значительно быстрее, чем при использовании AR, который, я полагаю, вы используете для создания модели. Я также предполагаю, что вы не пытаетесь загрузить 41k записей в раскрывающемся списке.

Возможно, нам понадобится немного больше информации о структуре таблицы, о том, как вы создаете модель и т. Д.

1 голос
/ 09 июня 2011

Не загружать 41 тыс. Записей и помещать их в теги HTML <option> кажется хорошим началом ...: -)

Загружайте только те, которые вам нужны, используя AJAX.

...