如何在控制器中看到CakePHP的SQL转储?
有没有一种方法可以让CakePHP按需转储它的SQL日志? 我想执行代码,直到我的控制器中的一个点,看看有什么SQL已经运行。
尝试这个:
$log = $this->Model->getDataSource()->getLog(false, false); debug($log);
http://api.cakephp.org/2.3/class-Model.html#_getDataSource
如果您有多个数据源,则必须为每个数据源执行此操作。
如果你使用CakePHP 1.3,你可以把它放在你的视图中输出SQL:
<?php echo $this->element('sql_dump'); ?>
因此,您可以创build一个名为“sql”的视图,只包含上面的行,然后在您的控制器中随时调用它来查看它:
$this->render('sql');
(还要记得在app/config/core.php
设置你的debugging级别至less为2)
资源
有四种显示查询的方法:
-
这将显示用户模型执行的最后一个查询:
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'); ?>
for cakephp 2.0在AppModel.php中写这个函数
function getLastQuery() { $dbo = $this->getDatasource(); $logs = $dbo->getLog(); $lastLog = end($logs['log']); return $lastLog['query']; }
要在控制器中使用它,请写:echo $ this-> YourModelName-> getLastQuery();
CakePHP没有$ this-> Model-> lastQuery();这是非常令人沮丧的。 这里有两个解决scheme,包括一个修改版的Handsofaten:
1.创build最后的查询function
要打印最后一个查询运行,请在/app_model.php文件中添加:
function lastQuery(){ $dbo = $this->getDatasource(); $logs = $dbo->_queriesLog; // return the first element of the last array (ie 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,但是我能够在不创buildsql.ctp视图的情况下完成上述操作。任何人都可以解释这一点吗?)
在CakePHP 1.2中
$db =& ConnectionManager::getDataSource('default'); $db->showLog();
最后我为什么工作,也与2.0兼容是添加在我的布局(或在模型中)
<?php echo $this->element('sql_dump');?>
它也取决于设置在Config / core.php中的debuggingvariables
用于蛋糕的插件DebugKit也可以完成这项工作。 https://github.com/cakephp/debug_kit