Советы по CMF Yii. Глава седьмая.
-
Кэширование запросов.
При кэшировании запроса его результат сохраняется в кэш и в дальшейшем берётся оттуда.
Например, чтобы сохранять кэш в файл необходимо в config/main.php указать:
- 'cache'=>array(
- 'class'=>'system.caching.CFileCache',
- ),
Выставляем время кеша в 1000 секунд для DAO:
- $sql = 'SELECT field1, field2 FROM {{apartment_reference}}';
- $dependency = new CDbCacheDependency('SELECT MAX(date_updated) FROM apartment_reference');
- $apReference = Yii::app()->db->cache(1000, $dependency)->createCommand($sql)->queryAll();
То же самое для AR:
- $dependency = new CDbCacheDependency('SELECT MAX(date_updated) FROM apartment_reference');
- $apReference = apReference::model()->cache(1000, $dependency)->findAll();
Для очистки всего кэша вызываем метод flush():
- Yii::app()->cache->flush();
-
Отладка SQL запросов.
На мой взгляд самым добротным отладчиком для Yii является расширение yii-debug-toolbar.
Если установить его нет возможности/необходимости/желания, а починить, например, падение sql запроса нужно.
На помощь придёт логирование в FireBug/инструменты разработчика Google Chrome.
Для этого в config/main.php нужны такие изменения:
- ...
- 'db'=>array(
- ...
- 'charset' => 'utf8',
- 'enableParamLogging' => 0,
- 'enableProfiling' => true,
- 'schemaCachingDuration' => 0,
- ....
- ),
-
- 'log'=>array(
- 'class'=>'CLogRouter',
- 'routes'=>array(
- array(
- 'class'=>'CWebLogRoute',
- 'levels'=>'trace',
- 'showInFireBug'=>true,
- ),
- ),
- ),
- ...
В файле index.php раскомментировать строки: defined('YII_DEBUG') or define('YII_DEBUG',true); и defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
-
- defined('YII_DEBUG') or define('YII_DEBUG',true);
-
- defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
Вкладка "Консоль" в FireFox:
Вкладка "Консоль" в Google Chrome:
Запрос, созданный при помощи построителя запросов, можно посмотреть при помощи CDbCommand::getText().
Например, имеем запрос:
- $sql = 'DELETE FROM {{apartment_reference}} WHERE apartment_id="'.$this->id.'"';
При вызове getText(), который позволяет посмотреть запрос, а не выполнить его.
- var_dump(Yii::app()->db->createCommand($sql)->text);
Получим при выводе:
- string(62) "DELETE FROM re_dev_apartment_reference WHERE apartment_id="37""
Для выполнения запроса используйте execute()
-
Построитель запросов.
В предыдущем примере вы увидели sql запрос на удаление (DELETE FROM {{apartment_reference}} WHERE ...)
Это выглядит "не в стиле" Yii.
Для тех кто не хочет использовать Active Record в Yii существует построитель запросов.
С его помощью этот же запрос на удаление записи будет иметь вид:
- Yii::app()->db->createCommand()->delete('{{apartment_reference}}', 'apartment_id=:id', array(':id'=>$this->id));
Добавление строки в таблицу:
- INSERT INTO `apartment_reference` (`field1`, `field2`) VALUES ('valueField1', 'valueField2');
- Yii::app()->db->createCommand()->insert('{{apartment_reference}}', array(
- 'field1'=>'valueField1',
- 'field2'=>'valueField2',
- ));
Изменение значения с строке:
- UPDATE `apartment_reference` SET `field1`='valueField1' WHERE id='1';
- Yii::app()->db->createCommand()->update('{{apartment_reference}}', array(
- 'field1'=>'valueField1',
- ), 'id=:id', array(':id'=>1));
Выборка данных:
- SELECT field1, field2 FROM `apartment_reference` WHERE id = '1';
- $apReference = Yii::app()->db->createCommand()
- ->select('field1, field2')
- ->from('{{apartment_reference}}')
- ->where('id=:id', array(':id'=>1))
- ->queryRow();
Обсудить статью на форуме