cakephp在执行之前看到编译的SQL Query

yos*_*ssi 15 sql debugging logging cakephp-1.3

我的查询在每次运行时都会收到超时错误.它是连接的一个分页.
我想调试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')
    );
Run Code Online (Sandbox Code Playgroud)

Bor*_*bev 30

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

然后加:

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

在你的布局结束时.这应该在您的默认蛋糕布局中注释掉.

您现在可以看到所有转到数据库的SQL查询.

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

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

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

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

  • 使用`ConnectionManager :: getDataSource('default')`从控制器调用时获取数据源 (3认同)
  • 不完全确定,因为我不记得确切的回报是什么.就试一试吧.它肯定会返回最后一个查询的日志.只需转储`$ logs`变量并检查它. (2认同)

Nin*_*sai 5

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

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

这肯定不是最干净的方式(因为你正在更改Cake目录)..但如果某些东西不能用于sql,那肯定会最快调试.

  • 答案对于无法访问`sql_dump`元素的命令行环境也很有帮助. (2认同)