如何在控制器中看到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)

资源

有四种显示查询的方法:

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

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