Есть ли способ заставить CakePHP сбрасывать свой SQL-журнал по требованию? Я хотел бы выполнить код до точки в моем контроллере и посмотреть, какой SQL был запущен.
Как я могу увидеть дамп CakePHP SQL в контроллере?
Ответ 1
Попробуйте следующее:
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
http://api.cakephp.org/2.3/class-Model.html#_getDataSource
Вам нужно будет сделать это для каждого источника данных, если у вас более одного.
Ответ 2
Если вы используете CakePHP 1.3, вы можете поместить это в свои представления для вывода SQL:
<?php echo $this->element('sql_dump'); ?>
Итак, вы можете создать представление под названием 'sql', содержащее только строку выше, а затем вызвать это в своем контроллере всякий раз, когда вы хотите его увидеть:
$this->render('sql');
(Также не забудьте установить уровень отладки как минимум 2 в app/config/core.php
)
Ответ 3
Существует четыре способа отображения запросов:
-
Это покажет последний запрос, выполненный в пользовательской модели:
debug($this->User->lastQuery());
-
Это покажет все выполненные запросы пользовательской модели:
$log = $this->User->getDataSource()->getLog(false, false); debug($log);
-
Это покажет журнал всех запросов:
$db =& ConnectionManager::getDataSource('default'); $db->showLog();
-
Если вы хотите показать весь журнал запросов по всему приложению, который вы можете использовать в представлении /element/filename.ctp.
<?php echo $this->element('sql_dump'); ?>
Ответ 4
для cakephp 2.0 Запишите эту функцию в AppModel.php
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
Чтобы использовать это в контроллере Write: echo $this- > YourModelName- > getLastQuery();
Ответ 5
Очень сложно, что CakePHP не имеет $this- > Model- > lastQuery();. Вот два решения, включая модифицированную версию Handsofaten:
1. Создать функцию последнего запроса
Чтобы распечатать последний запрос, в файле /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
2. Отобразить представление SQL (не используется в модели)
Чтобы распечатать все запросы, запущенные в заданном запросе страницы, в вашем контроллере (или компоненте и т.д.) выполните:
$this->render('sql');
Вероятно, это приведет к отсутствию ошибки просмотра, но это лучше, чем отсутствие доступа к последним запросам!
(Как сказал Handsofaten, в cake/libs/view/elements/есть файл /elements/sql _dump.ctp, но я смог сделать это без создания представления sql.ctp. Может ли кто-нибудь объяснить это?)
Ответ 6
В CakePHP 1.2..
$db =& ConnectionManager::getDataSource('default');
$db->showLog();
Ответ 7
Что работало наконец для меня, а также совместимо с 2.0, это добавить в мой макет (или в модели)
<?php echo $this->element('sql_dump');?>
Он также зависит от переменной отладки, установленной в Config/core.php
Ответ 8
Плагин DebugKit для тортов также выполнит эту работу. https://github.com/cakephp/debug_kit