我的查询在每次运行时都会收到超时错误。它是连接的分页。
我想调试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')
);
答案 0 :(得分:28)
首先,在debug
中将app/config/config.php
变量设置为2。
然后添加:
<?php echo $this->element('sql_dump');?>
布局结束时。这应该在您的默认蛋糕布局中注释掉。
您现在可以看到所有转到数据库的SQL查询。
现在复制查询并使用SQL EXPLAIN命令(链接用于MySQL)在数据库上查看查询在DBMS中的作用。有关CakePHP调试的更多信息,请检查here。
由于您的脚本甚至没有呈现,您可以尝试直接从数据源获取最新日志:
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
这需要在模型中,因为getDatasource()
函数是在模型中定义的。
检查整个$logs
变量并查看其中的内容。
答案 1 :(得分:5)
你可以做的另一件事是......
转到Cake / Model / DataSource / DboSource.php并找到函数execute()并打印$ sql变量。 那应该打印sql。
这肯定不是最干净的方式(因为你正在更改Cake目录)..但如果某些东西不能用于sql,那肯定会最快调试。
答案 2 :(得分:4)
Try...
function getLastQuery($model) {
$dbo = $model->getDatasource();
$logData = $dbo->getLog();
$getLog = end($logData['log']);
echo $getLog['query'];
}
答案 3 :(得分:2)
显示给定模型的所有已执行查询的简单方法:
$sqllog = $this->ModelName->getDataSource()->getLog(false, false);
debug($sqllog);
答案 4 :(得分:1)
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);
答案 5 :(得分:0)
在app / config / config.php中将调试变量设置为2。
echo $this->Payment->save();
Out put like =&gt; SQL查询:INSERT INTO photoora_photoorange
。payments
VALUES(*******)
[插入查询] [2]