16

我的查询在每次运行时都会出现超时错误。它是一个带有连接的分页。
我想调试 SQL,但由于超时,我看不到它。

如何在执行前查看已编译的 SQL 查询?


一些蛋糕代码:

$this -> paginate = array(
        'limit' => '16',
        'joins' => array( array(
                'table' => 'products',
                'alias' => 'Product',
                'type' => 'LEFT',
                'conditions' => array('ProductModel.id = Product.product_model_id')
            )),
        'fields' => array(
            'COUNT(Product.product_model_id) as Counter',
            'ProductModel.name'
            ),
        'conditions' => array(
            'ProductModel.category_id' => $category_id,
        ),
        'group' => array('ProductModel.id')
    );
4

7 回答 7

30

首先,将debug变量设置为 2 in app/config/config.php

然后加:

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

在布局的最后。这实际上应该在您的默认蛋糕布局中注释掉。

您现在将能够看到进入数据库的所有 SQL 查询。

现在复制查询并在数据库上使用SQL EXPLAIN命令(链接用于 MySQL)以查看查询在DBMS中的作用。有关 CakePHP 调试的更多信息,请查看此处

由于您的脚本甚至没有呈现,您可以尝试直接从数据源获取最新日志:

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

这需要在模型中,因为getDatasource()函数是在模型中定义的。检查整个$logs变量,看看里面有什么。

于 2013-05-29T07:34:35.473 回答
5

你可以做的另一件事是......

转到 Cake/Model/DataSource/DboSource.php 并找到函数 execute() 并打印 $sql 变量。那应该打印sql。

这当然不是最干净的方法(因为您正在更改 Cake 目录).. 但如果某些东西不能使用 sql 进行调试,肯定是最快的。

于 2015-01-23T06:41:47.837 回答
3
Try...
function getLastQuery($model) {
    $dbo = $model->getDatasource();
    $logData = $dbo->getLog();
    $getLog = end($logData['log']);
    echo $getLog['query'];
}
于 2014-05-22T12:06:30.647 回答
3

显示给定模型的所有已执行查询的简单方法:

  $sqllog = $this->ModelName->getDataSource()->getLog(false, false);       
  debug($sqllog);
于 2016-10-17T07:04:40.630 回答
2
class YourController extends AppController {
    function testfunc(){
        $this->Model->find('all', $options);
        echo 'SQL: '.$this->getLastQuery();
    }

    function getLastQuery()
    {
        $dbo = ConnectionManager::getDataSource('default');
        $logs = $dbo->getLog();
        $lastLog = end($logs['log']);
        return $lastLog['query'];
    }
}

或者您可以通过在 lib/Cake/Model/DataSource.php 中的函数 execute() 中添加以下行来获取所有查询

Debugger::dump($sql);
于 2015-02-27T15:37:03.660 回答
0

在 app/config/config.php 中将调试变量设置为 2。

echo $this->Payment->save();

输出像 =>SQL 查询: INSERT INTO photoora_photoorangepayments价值观 (*******)

[插入查询][2]

于 2017-05-05T06:40:43.057 回答
-1

set the debug variable to 2 in app/config/config.php.

enter image description here

And enter image description here

于 2017-05-05T06:32:43.247 回答