16

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

Laravel 4中有类似的东西吗?

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

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

4

8 回答 8

17

如果您使用的是 Laravel 4,请使用以下命令:

$queries    = DB::getQueryLog();
$last_query = end($queries);
于 2013-06-27T09:06:27.533 回答
11

我在 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");
});
于 2013-06-27T16:11:34.570 回答
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>
于 2013-09-30T02:12:40.520 回答
5

有一个 Composer 包:https ://packagist.org/packages/loic-sharma/profiler

它会在底部为您提供一个工具栏,其中包含 SQL 查询、日志消息等。确保debug在配置中设置为 true。

于 2013-06-27T09:40:36.717 回答
4

这是 Laravel 4 的另一个不错的调试选项:

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

于 2013-09-30T02:51:42.743 回答
2

我想出了一个非常简单的方法(如果您使用的是php artisan servePHP 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
于 2013-06-27T09:07:32.660 回答
1

这段代码直接取自其他来源,但我想让你更容易,因为它在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我:)

于 2014-09-04T09:25:56.410 回答
1

在 QueryBuilder 实例中有一个方法toSql()

echo DB::table('employees')->toSql()

会返回:

select * from `employees`

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

于 2016-06-07T08:28:53.870 回答