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

Jus*_*tin 74 sql cakephp

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

dec*_*eze 123

试试这个:

$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您需要设置`Configure :: write('debug',2);`以启用MySQL日志记录. (8认同)
  • 我最近不得不为遗留的1.2代码库做这个,方法类似,但不一样:`$ log = $ this-> Model-> getDataSource() - > showLog(false); debug($ log)`.以防万一其他人通过搜索遇到这个答案. (6认同)

Urd*_*mar 36

有四种显示查询的方法:

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

    debug($this->User->lastQuery());  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这将显示用户模型的所有已执行查询:

    $log = $this->User->getDataSource()->getLog(false, false);       
    debug($log);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 这将显示所有查询的日志:

    $db =& ConnectionManager::getDataSource('default');
    $db->showLog();
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果要在应用程序中显示所有查询,请在view/element/filename.ctp中使用.

    <?php echo $this->element('sql_dump'); ?>
    
    Run Code Online (Sandbox Code Playgroud)


bju*_*son 29

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

<?php echo $this->element('sql_dump'); ?>
Run Code Online (Sandbox Code Playgroud)

因此,您可以创建一个名为"sql"的视图,仅包含上面的行,然后在您想要查看时在控制器中调用它:

$this->render('sql');
Run Code Online (Sandbox Code Playgroud)

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

资源


Gov*_*tla 8

for cakephp 2.0在AppModel.php中编写此函数

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

要在Controller Write中使用它:echo $ this-> YourModelName-> getLastQuery();


小智 5

CakePHP没有$ this-> Model-> 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));
}
Run Code Online (Sandbox Code Playgroud)

然后打印输出你可以运行:

debug($this->lastQuery()); // in model
Run Code Online (Sandbox Code Playgroud)

要么

debug($this->Model->lastQuery()); // in controller
Run Code Online (Sandbox Code Playgroud)

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

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

$this->render('sql');
Run Code Online (Sandbox Code Playgroud)

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

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


rtc*_*ner 5

在CakePHP 1.2中..

$db =& ConnectionManager::getDataSource('default');
$db->showLog();
Run Code Online (Sandbox Code Playgroud)