如何在控制器中看到CakePHP的SQL转储?


75

有没有一种方法可以使CakePHP按需转储其SQL日志?我想执行代码直到控制器中的某个点,然后查看已运行的SQL。

Answers:


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 )。以防万一其他人通过搜索遇到此答案。
Rob Wilkerson

9
并且您将需要进行设置Configure::write('debug', 2);以启用MySQL日志记录。
Wirone 2012年

万一其他人需要快速引用getLog()参数的功能,请访问:api.cakephp.org/2.3/class-DboSource.html#_getLog
Ben Wilson

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 in 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();非常令人沮丧。这是两个解决方案,包括Handofaten的修改版本:

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视图的情况下完成上述操作。任何人都可以解释一下吗?)


5

在CakePHP 1.2中..

$db =& ConnectionManager::getDataSource('default');
$db->showLog();

2

最终对我有效并与2.0兼容的是添加布局(或模型)

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

它还取决于设置在Config / core.php中的调试变量


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.