在Laravel 5中,要获取执行的查询可以使用DB::getQueryLog()方法,但有时可能会遇到该方法返回空数组的问题。这通常是由于查询日志未被记录或者在所查询的代码中出现了错误。为了解决这个问题,需要确保在执行查询之前开启了查询日志功能,并且查询语句正确无误。另外,还可以检查是否有其他地方对查询日志进行了清空操作,导致返回的是空数组。通过排查以上可能的原因,可以解决DB::getQueryLog()返回空数组的问题。
我正在尝试查看查询的日志,但DB :: getQueryLog()只是返回一个空数组:
$user = User::find(5);print_r(DB::getQueryLog());
结果
Array()
如何查看此查询的日志?
解决方法:
默认情况下,Laravel 5中禁用查询日志:
/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
您需要通过调用以下命令启用查询日志:
DB::enableQueryLog();
或注册事件监听器:
DB::listen( function ($sql, $bindings, $time) { // $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1 // $bindings - [5] // $time(in milliseconds) - 0.38 });
一些技巧
1.多个DB连接
如果您有多个数据库连接,则必须指定要记录的连接
要为my_connection启用查询日志:
DB::connection('my_connection')->enableQueryLog();
要获取my_connection的查询日志:
print_r( DB::connection('my_connection')->getQueryLog());
2.在哪里启用查询日志?
对于HTTP请求生命周期,您可以在某些BeforeAnyDbQueryMiddlewaremiddleware的handle方法中启用查询日志,然后在同一中间件的terminate方法中检索已执行的查询.
class BeforeAnyDbQueryMiddleware{ public function handle($request, Closure $next) { DB::enableQueryLog(); return $next($request); } public function terminate($request, $response) { // Store or dump the log data... dd( DB::getQueryLog() ); }}
中间件的链不会针对工匠命令运行,因此对于CLI执行,您可以在artisan.start事件侦听器中启用查询日志.
例如,您可以将它放在bootstrap / app.php文件中
$app['events']->listen('artisan.start', function(){ \DB::enableQueryLog();});
记忆
Laravel将所有查询保存在内存中.因此,在某些情况下,例如插入大量行或具有大量查询的长时间运行作业时,这可能会导致应用程序使用过多的内存.
在大多数情况下,您只需要查询日志以进行调试,如果是这种情况,我建议您仅为开发启用它.
if (App::environment('local')) { // The environment is local DB::enableQueryLog();}
参考
>/docs/5.0/database#query-logging
来源:/content-1-453751.html