Laravel 4 SQL日志/控制台

时间:2013-06-27 09:02:45

标签: laravel laravel-4

Laravel中是否有类似的东西可以让你看到正在执行的实际SQL? 例如,在Rails中,您可以在控制台中看到SQL。在Django中你有一个工具栏。

Laravel 4中有类似的东西吗?

澄清一下:我的问题是如何在没有代码的情况下做到这一点。是否有一些内置在Laravel中的东西不需要我在app中编写代码?

更新:我希望也能看到CLI查询(例如php artisan migrate

8 个答案:

答案 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的另一个不错的调试选项:

https://github.com/barryvdh/laravel-debugbar

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

这是显示查询的最简单方法。