Чи є спосіб, за допомогою якого CakePHP може скидати свій журнал SQL на вимогу? Я хотів би виконувати код до моменту в моєму контролері і подивитися, який SQL був запущений.
Відповіді:
Спробуйте це:
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
http://api.cakephp.org/2.3/class-Model.html#_getDataSource
Вам доведеться це робити для кожного джерела даних, якщо у вас їх більше одного.
Configure::write('debug', 2);
щоб увімкнути ведення журналу MySQL.
Існує чотири способи показу запитів:
Це покаже останній запит, виконаний для моделі користувача:
debug($this->User->lastQuery());
Це покаже всі виконані запити моделі користувача:
$log = $this->User->getDataSource()->getLog(false, false);
debug($log);
Це покаже журнал усіх запитів:
$db =& ConnectionManager::getDataSource('default');
$db->showLog();
Якщо ви хочете показати всі журнали запитів у всій програмі, ви можете використовувати у view / element / filename.ctp.
<?php echo $this->element('sql_dump'); ?>
Якщо ви використовуєте CakePHP 1.3, ви можете помістити це у свої подання для виведення SQL:
<?php echo $this->element('sql_dump'); ?>
Таким чином, ви можете створити представлення під назвою 'sql', що містить лише рядок вище, а потім викликати це у своєму контролері, коли ви хочете його побачити:
$this->render('sql');
(Також не забудьте встановити рівень налагодження щонайменше 2 дюйма app/config/core.php
)
для cakephp 2.0 Напишіть цю функцію в AppModel.php
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
Щоб використовувати це в Controller Write: echo $ this-> YourModelName-> getLastQuery ();
Дуже прикро, що CakePHP не має $ this-> Model-> lastQuery () ;. Ось два рішення, включаючи модифіковану версію Handsofaten's:
Щоб надрукувати останній запуск запиту, додайте у файл /app_model.php:
function lastQuery(){
$dbo = $this->getDatasource();
$logs = $dbo->_queriesLog;
// return the first element of the last array (i.e. the last query)
return current(end($logs));
}
Потім для друку виводу ви можете запустити:
debug($this->lastQuery()); // in model
АБО
debug($this->Model->lastQuery()); // in controller
Щоб роздрукувати всі запити, що виконуються в заданому запиті на сторінку, у вашому контролері (або компоненті тощо):
$this->render('sql');
Ймовірно, це призведе до відсутньої помилки подання, але це краще, ніж відсутність доступу до останніх запитів!
(Як сказав Handsofaten, у файлі cake / libs / view / elements / є /elements/sql_dump.ctp, але я зміг зробити все вище, не створюючи подання sql.ctp. Хтось може це пояснити?)
Плагін DebugKit для торта теж зробить свою роботу. https://github.com/cakephp/debug_kit
$log = $this->Model->getDataSource()->showLog( false ); debug( $log )
. Про всяк випадок, коли хтось інший натрапляє на цю відповідь через пошук.