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

时间:2010-09-05 17:47:13

标签: sql cakephp

有没有办法可以导致CakePHP根据需要转储其SQL日志?我想执行代码,直到我的控制器中的某个点,看看SQL运行了什么。

8 个答案:

答案 0 :(得分:123)

试试这个:

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

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

如果您有多个数据源,则必须为每个数据源执行此操作。

答案 1 :(得分:34)

有四种显示查询的方法:

  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'); ?>
    

答案 2 :(得分:29)

如果你正在使用CakePHP 1.3,你可以将它放在你的视图中输出SQL:

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

所以你可以创建一个名为'sql'的视图,只包含上面的行,然后在你想看的时候在你的控制器中调用它:

$this->render('sql');

(还记得将调试级别设置为app/config/core.php中的至少2)

Source

答案 3 :(得分:7)

for cakephp 2.0 在AppModel.php

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

在Controller中使用它 写:echo $ this-&gt; YourModelName-&gt; getLastQuery();

答案 4 :(得分:5)

CakePHP没有$ this-&gt; Model-&gt; 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

OR

debug($this->Model->lastQuery()); // in controller

2。渲染SQL视图(在模型中无效)

打印出在给定页面请求中运行的所有查询,在控制器(或组件等)中运行:

$this->render('sql');

它可能会丢失一个错误的视图错误,但这比不能访问最近的查询要好!

(正如Handsofaten所说,cake / libs / view / elements /中有/elements/sql_dump.ctp,但我能够在不创建sql.ctp视图的情况下完成上述操作。有人可以解释一下吗?)< / p>

答案 5 :(得分:4)

在CakePHP 1.2 ..

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

答案 6 :(得分:2)

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

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

它还取决于设置到Config / core.php

中的调试变量

答案 7 :(得分:0)

蛋糕的插件DebugKit也可以完成这项工作。 https://github.com/cakephp/debug_kit