0

你知道有什么方法可以像在 CakePHP 中一样显示在 Lithium 中执行的查询吗?我可能会更容易找到执行的内容。在页面底部,它显示了执行的查询。

![截图] 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

4

3 回答 3

1

您可以通过向您希望记录的查询类型添加过滤器来做到这一点。您可以在引导文件中全局定义它们,也可以在控制器中“本地化”定义它们。下面的示例不会很好地打印查询,但是当您拥有数据时这很容易做到。

下面的代码显示了如何获取信息,它并没有以漂亮的方式输出它。

   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;
});
于 2012-11-10T10:24:01.887 回答
1

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

如果您正在寻找像 Cake 的调试工具栏这样的开箱即用解决方案,请检查li3_perf项目:https ://github.com/tmaiaroto/li3_perf

于 2012-11-10T10:47:16.997 回答
0

根据 Nils 和 Mehdi 的所有建议,我创建了一个新插件,它只会显示查询结果,而不是 vardump 或 print_r() 用于使用 MongoDB 在 Lithium 中执行的查询。

我现在真的很容易找到它正在执行的内容。

你可以看看 Github 上的项目:

https://github.com/nilamdoc/li3_show

li3_show 的输出

于 2012-11-12T20:38:40.133 回答