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

z4iuyo4d  于 2022-11-11  发布在  PHP
关注(0)|答案(9)|浏览(171)

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

s3fp2yjn

s3fp2yjn1#

试试看:

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

http://api.cakephp.org/2.3/class-Model.html#_getDataSource
如果您有多个数据源,则必须对每个数据源执行此操作。

0s0u357o

0s0u357o2#

有四种方式可显示查询:
1.这将显示用户模型中执行的最后一个查询:

debug($this->User->lastQuery());

1.这将显示用户模型的所有已执行查询:

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

1.这将显示所有查询的日志:

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

1.如果你想显示整个应用程序的所有查询日志,你可以在view/element/filename. ctp中使用。

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

6qftjkof3#

如果你使用的是CakePHP 1.3,你可以把这个放在你的视图中,输出SQL:

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

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

$this->render('sql');

(Also请记住在app/config/core.php中将调试级别至少设置为2)
来源

zc0qhyus

zc0qhyus4#

在AppModel.php中编写此函数

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

要在控制器写入中使用此选项:如果您的用户名是您的用户名,请单击“返回”。

9lowa7mx

9lowa7mx5#

令人非常沮丧的是CakePHP没有一个$this-〉Model-〉lastQuery();。以下是两个解决方案,包括Handsofaten的修改版本:

1.创建Last查询函数

要打印上次运行的查询,请在/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视图(在模型中不可用)

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

$this->render('sql');

它可能会抛出一个缺少视图的错误,但这总比不访问最近的查询要好!
(As Handsofaten说,cake/libs/view/elements/中有/elements/sql_dump.ctp,但我可以在不创建sql.ctp视图的情况下完成上述操作。有人能解释一下吗?)

s8vozzvw

s8vozzvw6#

在CakePHP 1.2中,您可以使用

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

0yg35tkg7#

最后对我起作用并且与2.0兼容的是在我的布局(或模型)中添加

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

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

mw3dktmi

mw3dktmi8#

蛋糕的插件DebugKit也可以完成这项工作。https://github.com/cakephp/debug_kit

wj8zmpe1

wj8zmpe19#

如果您对代码的某个特定部分感兴趣,可以先清除日志,然后只显示在该点之后发生的查询。
另请注意,下面的“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;

相关问题