Laravel 中是否有类似的东西可以让你看到正在执行的实际 SQL?例如,在 Rails 中,您可以在控制台中看到 SQL。在 Django 中,您有一个工具栏。
Laravel 4中有类似的东西吗?
澄清一下:我的问题是如何在没有代码的情况下做到这一点。Laravel 中是否有内置的东西不需要我在应用程序中编写代码?
更新:最好我也希望看到 CLI 查询(例如php artisan migrate
)
如果您使用的是 Laravel 4,请使用以下命令:
$queries = DB::getQueryLog();
$last_query = end($queries);
我在 Laravel 4 中这样做。
只需在任何地方或任何地方设置一次,app/start/global.php
但确保它已加载,然后它将开始记录所有 SQL 查询。
Event::listen("illuminate.query", function($query, $bindings, $time, $name){
\Log::sql($query."\n");
\Log::sql(json_encode($bindings)."\n");
});
这是一个快速的 Javascript 片段,您可以将其添加到您的母版页模板中。只要包含它,所有查询都将输出到浏览器的 Javascript 控制台。它将它们打印在一个易于阅读的列表中,从而可以轻松浏览您的站点并查看每个页面上正在执行的查询。
完成调试后,只需将其从模板中删除即可。
<script type="text/javascript">
var queries = {{ json_encode(DB::getQueryLog()) }};
console.log('/****************************** Database Queries ******************************/');
console.log(' ');
$.each(queries, function(id, query) {
console.log(' ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
});
console.log(' ');
console.log('/****************************** End Queries ***********************************/');
</script>
有一个 Composer 包:https ://packagist.org/packages/loic-sharma/profiler
它会在底部为您提供一个工具栏,其中包含 SQL 查询、日志消息等。确保debug
在配置中设置为 true。
这是 Laravel 4 的另一个不错的调试选项:
我想出了一个非常简单的方法(如果您使用的是php artisan serve
PHP 5.4) - 将其添加到app/start/local.php
:
DB::listen(function($sql, $bindings, $time)
{
file_put_contents('php://stderr', "[SQL] {$sql} in {$time} s\n" .
" bindinds: ".json_encode($bindings)."\n");
});
但希望找到更官方的解决方案。
这将打印如下 SQL 语句:
[SQL] select 1 in 0.06s
这段代码直接取自其他来源,但我想让你更容易,因为它在PHPStorm上使用我的终端窗口对我有用,我能够看到完整的日志,但是,登录后有一些Sentry的东西。
1.添加
'log'=>true
在您config/database.php
的数据库名称的内部和下方ex.mysql
然后将下面的代码添加到routes.php
最重要的 no 在任何路由配置下,因为您可以在给定的路由配置下进行,但是您只能看到何时调用该路由。
看到这个输出/goto / app/storage/log/somelogfile.log
if (Config::get('database.log', false))
{
Event::listen('illuminate.query', function($query, $bindings, $time, $name)
{
$data = compact('bindings', 'time', 'name');
// Format binding data for sql insertion
foreach ($bindings as $i => $binding)
{
if ($binding instanceof \DateTime)
{
$bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
}
else if (is_string($binding))
{
$bindings[$i] = "'$binding'";
}
}
// Insert bindings into query
$query = str_replace(array('%', '?'), array('%%', '%s'), $query);
$query = vsprintf($query, $bindings);
Log::info($query, $data);
});
}
不要忘记打断点....或ping我:)
在 QueryBuilder 实例中有一个方法toSql()。
echo DB::table('employees')->toSql()
会返回:
select * from `employees`
这是显示查询的最简单方法。