Laravel中是否有类似的东西可以让你看到正在执行的实际SQL? 例如,在Rails中,您可以在控制台中看到SQL。在Django中你有一个工具栏。
Laravel 4中有类似的东西吗?
澄清一下:我的问题是如何在没有代码的情况下做到这一点。是否有一些内置在Laravel中的东西不需要我在app中编写代码?
更新:我希望也能看到CLI查询(例如php artisan migrate
)
答案 0 :(得分:17)
如果您使用的是Laravel 4,请使用:
$queries = DB::getQueryLog();
$last_query = end($queries);
答案 1 :(得分:10)
我在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");
});
答案 2 :(得分:6)
这是一个快速的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>
答案 3 :(得分:5)
有一个Composer包:https://packagist.org/packages/loic-sharma/profiler
它将在底部为您提供一个工具栏,其中包含SQL查询,日志消息等。确保在配置中将debug
设置为true。
答案 4 :(得分:4)
这是Laravel 4的另一个不错的调试选项:
答案 5 :(得分:1)
我提出了一种非常简单的方法(如果你使用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
答案 6 :(得分:1)
此代码直接从其他来源获取,但我想让您轻松,因为我在 PHPStorm 上使用我的终端窗口为我工作了我能够看到完整的日志但是,之后登录有一些 Sentry 的事情。
1.add
'log'=>true
在您的config/database.php
内以及地址数据库名称ex.mysql
然后将下面的代码添加到routes.php
以上所有不在任何路由配置下,因为你可以在给定路由配置下进行,但是,你只看到该路由何时被调用。
查看此输出/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我:)
答案 7 :(得分:1)
在QueryBuilder实例中,有一个方法 toSql()。
echo DB::table('employees')->toSql()
将返回:
select * from `employees`
这是显示查询的最简单方法。