Как я могу увидеть дамп SQL CakePHP в контроллере? - PullRequest
73 голосов
/ 05 сентября 2010

Есть ли способ заставить CakePHP создавать дамп своего журнала SQL по требованию?Я хотел бы выполнить код до момента в моем контроллере и посмотреть, какой SQL был запущен.

Ответы [ 8 ]

123 голосов
/ 06 сентября 2010

Попробуйте это:

$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);

http://api.cakephp.org/2.3/class-Model.html#_getDataSource

Вы должны будете сделать это для каждого источника данных, если у вас их более одного.

35 голосов
/ 16 декабря 2013

Существует четыре способа отображения запросов:

  1. Это покажет последний запрос, выполненный для пользовательской модели:

    debug($this->User->lastQuery());  
    
  2. Это покажет все выполненные запросы модели пользователя:

    $log = $this->User->getDataSource()->getLog(false, false);       
    debug($log);
    
  3. Это покажет журнал всех запросов:

    $db =& ConnectionManager::getDataSource('default');
    $db->showLog();
    
  4. Если вы хотите отобразить журнал всех запросов по всему приложению, вы можете использовать его в view / element / filename.ctp.

    <?php echo $this->element('sql_dump'); ?>
    
29 голосов
/ 06 сентября 2010

Если вы используете CakePHP 1.3, вы можете поместить это в свои представления для вывода SQL:

<?php echo $this->element('sql_dump'); ?>

Таким образом, вы можете создать представление с именем 'sql', содержащее только строку выше, а затем вызывать его в вашем контроллере всякий раз, когда захотите его увидеть:

$this->render('sql');

(Также не забудьте установить уровень отладки как минимум 2 в app/config/core.php)

Источник

7 голосов
/ 17 мая 2013

для cakephp 2.0. Напишите эту функцию в AppModel.php

function getLastQuery()
{
    $dbo = $this->getDatasource();
    $logs = $dbo->getLog();
    $lastLog = end($logs['log']);
    return $lastLog['query'];
}

Чтобы использовать это в Controller, напишите: echo $ this-> YourModelName-> getLastQuery ();

5 голосов
/ 12 октября 2011

Очень неприятно, что CakePHP не имеет $ this-> Model-> lastQuery () ;.Вот два решения, включая модифицированную версию Handsofaten's:

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, файл /elements/sql_dump.ctp есть в cake / libs / view / elements /, носмог сделать вышеупомянутое без создания представления sql.ctp. Кто-нибудь может объяснить это?)

4 голосов
/ 04 января 2013

In CakePHP 1.2 ..

$db =& ConnectionManager::getDataSource('default');
$db->showLog();
2 голосов
/ 28 февраля 2013

Что сработало окончательно для меня и совместимо с 2.0, так это добавить в мой макет (или в модель)

<?php echo $this->element('sql_dump');?>

Это также зависит от переменной отладки, установленной в Config / core.php

0 голосов
/ 25 ноября 2015

Плагин DebugKit для торта тоже подойдет. https://github.com/cakephp/debug_kit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...