2012-11-09 30 views
0

您是否知道任何显示查询在锂中执行的方法,就像它在CakePHP中执行的一样。 我可能会更容易找到执行的内容。 在页面底部显示执行的查询。 !锂:我们可以看到执行的查询如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; 

}); 

它给我的输出为自我而params所有的var_dump,但我需要执行的SQL查询。

请查看屏幕通过添加过滤器,以你希望记录的查询类型的拍摄http://imgur.com/ffNfQ

+0

请检查我的更新答案波纹管,第二个过滤器将八方通输出的确切SQL,而不仅仅是参数建立它。如果您有任何问题,请发表评论。 – Nils

回答

0

基于来自Nils和迈赫迪都建议我创建了一个新的插件,它不仅会显示查询结果,而不是针对在使用MongoDB的Lithium中执行的查询的vardump或print_r()。

现在真的变得更容易找到它正在执行的内容。

您可以在Github上的项目来看一看:

https://github.com/nilamdoc/li3_show

Output of li3_show

0

你可以做到这一点。你可以在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; 
}); 
+0

请再次检查我的问题。我想要结果显示查询触发到数据库。 –

+0

我已经从您的研究中添加了我的答案。感谢您的建议。现在你也可以贡献于插件 https://github.com/nilamdoc/li3_show –

1

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

如果你正在寻找出的现成的解决方案就像蛋糕的调试工具栏,检查li3_perf项目:https://github.com/tmaiaroto/li3_perf

+0

我试过li3_pref它也给vardump,我正在寻找输出显示实际查询触发到数据库。 –

+0

我写的过滤器显示发送到数据库 –

+0

@MehdiLahmamB的实际查询。爱过滤器,有很多方法可以做类似的事情。我喜欢这个要点,我需要更多地看一下Logger。 – Nils

相关问题