您是否了解在Cake中执行查询的任何方法,就像在CakePHP中一样。 我可能会更容易找到执行的内容。 在页面底部显示执行的查询。
![截屏] http://imgur.com/ffNfQ
收到答案后,我将代码添加到控制器中:
Volumes::applyFilter('find', function($self, $params, $chain) {
echo '<pre>===== self ======<br>';
var_dump($self);
echo '===== params ======<br>';
var_dump($params);
echo '===== chain ======<br>';
var_dump($chain);
echo '</pre>';
$next = $chain->next($self, $params, $chain);
return $next;
});
它给我一个关于self和params的所有var_dump的输出,但是我需要执行的SQL查询。
请检查屏幕截图http://imgur.com/ffNfQ
答案 0 :(得分:1)
您可以通过向要记录的查询类型添加过滤器来执行此操作。你可以在bootstrap文件中定义它们,我们可以在控制器中定义它们“localy”。下面的示例不会打印好查询,但是当您拥有数据时,这很容易。
下面的代码显示了如何获取信息,它不会以漂亮的方式输出。
Connections::get('default')->applyFilter('read', function($self, $params, $chain) {
echo "===========</br>\n";
if (is_object($params['query'])){
var_dump($params['query']->conditions());
}
else{
echo 'Query: '; var_dump($params['query']); echo "</br>\n";
}
$time = microtime(true);
$next = $chain->next($self, $params, $chain);
$time = microtime(true) - $time;
echo "Results: " . count((array)$next) . "</br>\n";
echo "Time: " . $time . "</br>\n";
return $next;
});
请注意,直接从过滤器回显数据会使您的页面无效,因为这将在标题之前打印。但是,如果将过滤器中的数据保存到数组而不是输出它,则可以稍后在视图中使用它。例如,您可以创建一个模板来将此信息添加到页面中。
编辑:更新的代码
Edit2:添加了一种方法来始终获取执行的确切SQL。获得
Connections::get('default')->applyFilter('_execute', function($self, $params, $chain) {
echo "SQL: " . $params['sql'] . "</br>\n";
$time = microtime(true);
$next = $chain->next($self, $params, $chain);
$time = microtime(true) - $time;
$count = 0;
while ($next->next())
$count++;
$next->rewind();
echo "Count: " . $count . "</br>\n";
echo "Time: " . $time . "</br>\n";
echo "=====================</br>\n";
return $next;
});
答案 1 :(得分:1)
read
个查询记录到production
环境中的文件中
您应该能够自定义并在create
,update
和delete
操作中添加过滤器,以满足您的需求。
如果您正在寻找像Cake的调试工具栏这样的开箱即用解决方案,请查看li3_perf
项目:https://github.com/tmaiaroto/li3_perf
答案 2 :(得分:0)
根据Nils和Mehdi的所有建议,我创建了一个新的插件,它只显示查询结果,而不是用于在带有MongoDB的Lithium中执行的查询的vardump或print_r()。
现在我已经变得更容易找到正在执行的内容。
你可以看看Github上的项目:
https://github.com/nilamdoc/li3_show