id(); $table->text('useragent'); $table->string('ip'); $table->timestamps(); $table->timestamp('ended_at')->nullable(); }); Schema::create('analytics_requests', function (Blueprint $table) { $table->id(); $table->bigInteger('session_id')->unsigned(); $table->string('type'); $table->string('path'); $table->timestamps(); $table->foreign('session_id')->references('id')->on('analytics_sessions')->onDelete('cascade'); }); // Migrate old analytics table $analytics = DB::table('analytics') ->select( 'session', DB::raw('MAX(useragent) as useragent'), DB::raw('MAX(ip) as ip'), DB::raw('MIN(created_at) as created_at'), DB::raw('MIN(updated_at) as updated_at')) ->groupBy('session') ->get(); foreach ($analytics as $sessionItem) { $ip = $sessionItem->ip; $useragent = $sessionItem->useragent; $session_id = $sessionItem->session; $created_at = $sessionItem->created_at; $updated_at = $sessionItem->updated_at; // Create a new row in analytics_sessions $new_session_id = DB::table('analytics_sessions')->insertGetId([ 'id' => $session_id, 'useragent' => $useragent, 'ip' => $ip, 'created_at' => $created_at, 'updated_at' => $updated_at ]); $requests = DB::table('analytics')->where('session', $session_id)->select('type', 'attribute', 'created_at', 'updated_at')->get(); $ended_at = $sessionItem->created_at; foreach($requests as $requestItem) { if($ended_at < $requestItem->created_at) { $ended_at = $requestItem->created_at; } DB::table('analytics_requests')->insert([ 'session_id' => $new_session_id, 'type' => $requestItem->type, 'path' => $requestItem->attribute, 'created_at' => $requestItem->created_at, 'updated_at' => $requestItem->updated_at, ]); } DB::table('analytics_sessions')->where('id', $new_session_id)->update(['ended_at' => $ended_at]); } Schema::dropIfExists('analytics'); } /** * Reverse the migrations. */ public function down(): void { Schema::create('analytics', function (Blueprint $table) { $table->id(); $table->bigInteger('session')->nullable(false); $table->string('type'); $table->string('attribute')->default(''); $table->text('useragent'); $table->string('ip'); $table->timestamps(); }); $sessions = DB::table('analytics_sessions')->get(); foreach ($sessions as $session) { $requests = DB::table('analytics_requests')->where('session_id', $session->id)->get(); foreach($requests as $request) { DB::table('analytics')->insert([ 'session' => $session->id, 'type' => $request->type, 'attribute' => $request->path, 'ip' => $session->ip, 'useragent' => $session->useragent, 'created_at' => $request->created_at, 'updated_at' => $request->updated_at, ]); } } Schema::dropIfExists('analytics_requests'); Schema::dropIfExists('analytics_sessions'); } };