您可以通过向您希望记录的查询类型添加过滤器来做到这一点。您可以在引导文件中全局定义它们,也可以在控制器中“本地化”定义它们。下面的示例不会很好地打印查询,但是当您拥有数据时这很容易做到。
下面的代码显示了如何获取信息,它并没有以漂亮的方式输出它。
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;
});