Як я можу побачити дамп SQL CakePHP у контролері?


76

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

Відповіді:


125

Спробуйте це:

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

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

Вам доведеться це робити для кожного джерела даних, якщо у вас їх більше одного.


6
Нещодавно я мав зробити це для успадкованої 1,2 кодової бази і метод подібний до, але не те ж саме: $log = $this->Model->getDataSource()->showLog( false ); debug( $log ). Про всяк випадок, коли хтось інший натрапляє на цю відповідь через пошук.
Роб Вілкерсон,

9
І вам потрібно буде встановити, Configure::write('debug', 2);щоб увімкнути ведення журналу MySQL.
Wirone

На випадок, якщо комусь ще знадобиться швидка перевірка того, що роблять аргументи getLog (): api.cakephp.org/2.3/class-DboSource.html#_getLog
Бен Вілсон

37

Існує чотири способи показу запитів:

  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

Якщо ви використовуєте CakePHP 1.3, ви можете помістити це у свої подання для виведення SQL:

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

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

$this->render('sql');

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

Джерело


9

для 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 ();


5

Дуже прикро, що 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, у файлі cake / libs / view / elements / є /elements/sql_dump.ctp, але я зміг зробити все вище, не створюючи подання sql.ctp. Хтось може це пояснити?)



2

Що, нарешті, у мене вийшло, а також сумісно з 2.0, - це додати в мій макет (або в модель)

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

Це також залежить від змінної налагодження, встановленої в Config / core.php


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.