Laravel 4 - 记录 SQL 查询

2022-08-30 13:20:00

关于在Laravel 4中记录SQL查询已经有几个问题。但是我几乎都尝试过,但它仍然没有按照我想要的方式工作。

这是我的情况

  1. 在我的php视图文件中,我向服务器发出AJAX请求
  2. 收到AJAX请求并运行RAW参数化的Postgres SQL查询(例如

    DB::select('select * from my_table where id=?', array(1))

如果我使用

Event::listen('illuminate.query', function($sql)
{
  Log::error($sql);
});

我只是得到“从my_table中选择*,其中id=?”作为没有ID值实际填充的日志消息。

如果我使用

$queries = DB::getQueryLog();
$last_query = end($queries);
Log::error(print_r($last_query, true));

我仍然没有填充ID的最终SQL查询。

最后,如果我使用像 https://github.com/loic-sharma/profiler 这样的日志记录工具 - 它不会显示任何内容,因为我正在发出AJAX请求。

我是否用尽了我的选择?还有别更好的方法吗?


答案 1

以下是我当前用于记录sql查询的内容。您应该能够将其放入主路由文件中,然后将“log” = > true添加到数据库配置中。

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);
    });
}

感谢Jeemusu回答关于将绑定插入预准备语句的一点。


答案 2

您应该能够通过传递为 Event 函数的第二个参数来查找绑定。$bindings

Event::listen('illuminate.query', function($sql, $bindings, $time){
    echo $sql;          // select * from my_table where id=? 
    print_r($bindings); // Array ( [0] => 4 )
    echo $time;         // 0.58 

    // To get the full sql query with bindings inserted
    $sql = str_replace(array('%', '?'), array('%%', '%s'), $sql);
    $full_sql = vsprintf($sql, $bindings);
});

在Laravel 3.x中,我认为事件侦听器被称为laravel.query


推荐