有没有办法可以导致CakePHP根据需要转储其SQL日志?我想执行代码,直到我的控制器中的某个点,看看SQL运行了什么。
答案 0 :(得分:123)
试试这个:
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
http://api.cakephp.org/2.3/class-Model.html#_getDataSource
如果您有多个数据源,则必须为每个数据源执行此操作。
答案 1 :(得分:34)
有四种显示查询的方法:
这将显示用户模型执行的最后一个查询:
debug($this->User->lastQuery());
这将显示用户模型的所有已执行查询:
$log = $this->User->getDataSource()->getLog(false, false);
debug($log);
这将显示所有查询的日志:
$db =& ConnectionManager::getDataSource('default');
$db->showLog();
如果要显示所有查询,请在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)
答案 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的修改版本:
要打印上次查询运行,请在/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
打印出在给定页面请求中运行的所有查询,在控制器(或组件等)中运行:
$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