Lithium:我们可以看到如CakePHP中所示执行的查询

时间:2012-11-09 18:42:02

标签: debugging logging lithium

您是否了解在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

3 个答案:

答案 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)

<@>如@Nils建议的那样,您可以利用Lithium过滤器并编写一个简单的查询记录器  我做了一个here。它会将read个查询记录到production环境中的文件中 您应该能够自定义并在createupdatedelete操作中添加过滤器,以满足您的需求。

如果您正在寻找像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

Output of li3_show