Подтвердить что ты не робот

Как я могу увидеть дамп CakePHP SQL в контроллере?

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

4b9b3361

Ответ 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)

Source

Ответ 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