如何跟踪 laravel 5 中的每个用户数据库交互?

How to track every user database interaction in laravel 5?

如果任何登录用户访问任何服务,那么我想跟踪该用户的所有查询 运行。

示例:

如果 user1 登录并想删除他的个人资料详细信息,而 user2 想更新他的个人资料详细信息,那么我想在 table 中获取数据,如下所示

user  |   user_id  |   service     |   query  
user1 |     1      | deleteProfile |   "DELETE FROM Users WHERE id=1"
user2 |     2      | updateProfile |   "UPDATE Users SET lastname='Thaper' WHERE id=2"

为此,我尝试使用 activity 日志,如 antonioribeiro/tracker and laravel-activitylog 等,但它不符合我的要求。

如何在 Laravel 5.2 中执行此操作?

您可以使用中间件来做到这一点:

use DB;

class DatabaseLogger {

     public function handle($request, $next) {
          DB::connection()->enableQueryLog();
          return $next($request);
     }

     public function terminate($request, $response) {
         $queries = DB::getQueryLog();
         $id = Auth::check()?Auth::id():null;
         collect($queries)->each(function ($query) use ($id) { 
               DB::table("querylogtable")->insert(["user_id"=>$id,"query"=>$query]);
         });
     }

}

将此中间件添加到您的 Kernel.php

protected $middleware = [  
    CheckForMaintenanceMode::class,
    DatabaseLogger::class           
];

请注意,如果要执行大量查询,将所有查询保存在内存中可能会很费力。

更多信息请访问 https://laravel.com/docs/5.0/database#query-logging

作为替代方案,您可以在服务提供商中注册以下内容:

   DB::listen(function ($query) {
        //code to log the query
    });

但是请注意,记录查询也会触发此事件,导致无限递归记录,因此如果您采用此路线,请确保您不记录日志记录事件。

更多信息:https://laravel.com/docs/5.2/database#running-queries