How can I see CakePHP's SQL dump in the controller?

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

153266 次浏览

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

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

因此,您可以创建一个名为“ sql”的视图,只包含上面的行,然后随时在控制器中调用它:

$this->render('sql');

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

来源

试试这个:

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

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

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

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 视图(模型中无效)

To print out all queries run in a given page request, in your controller (or component, etc) run:

$this->render('sql');

It will likely throw a missing view error, but this is better than no access to recent queries!

(如 Handsofaten 所说,有/element/sql _ dump。Ctp,但是我可以在不创建 sql.ctp 视图的情况下完成上述操作。有人能解释一下吗?)

在 CakePHP 1.2中。

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

对我来说最终起作用并且与2.0兼容的是添加我的布局(或者模型)

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

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

Cakephp 2.0版 在 AppModel.php 中编写这个函数

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

To use this in Controller Write : echo $this->YourModelName->getLastQuery();

有四种方式显示查询:

  1. 这将显示用户模型执行的最后一个查询:

    debug($this->User->lastQuery());
    
  2. This will show all executed query of user model:

    $log = $this->User->getDataSource()->getLog(false, false);
    debug($log);
    
  3. This will show a log of all queries:

    $db =& ConnectionManager::getDataSource('default');
    $db->showLog();
    
  4. If you want to show all queries log all over the application you can use in view/element/filename.ctp.

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

蛋糕的插件调试工具包也可以完成这项工作

如果您对代码的某些特定部分感兴趣,可以首先清除日志,然后只显示该点之后发生的查询。

还要注意下面的‘ Model’是实际的类名,比如 User、 Page 等等。

//clear log (boolean $clear = true)
$this->Model->getDataSource()->getLog(false, true);
...
...
...
...
//Show log so far
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
exit;