saasscaleup/laravel-n-plus-one-detector
Installation:
composer require saasscaleup/laravel-n-plus-one-detector
Publish the config file:
php artisan vendor:publish --provider="Saasscaleup\NPlusOneDetector\NPlusOneDetectorServiceProvider"
First Use Case: Run the detector in your local environment:
php artisan nplusone:detect
This will scan your application for N+1 queries in real-time and log findings to storage/logs/nplusone.log.
Dashboard Access:
Register the middleware in app/Http/Kernel.php:
'web' => [
\Saasscaleup\NPlusOneDetector\Http\Middleware\NPlusOneDetector::class,
// other middleware...
],
Access the dashboard at /nplusone-dashboard (configured in .env).
Development Workflow:
.env:
NPLUSONE_DETECTOR_ENABLED=true
php artisan nplusone:detect --env=testing
CI/CD Pipeline:
- name: Detect N+1 Queries
run: php artisan nplusone:detect --env=staging
config/nplusone.php):
'fail_on_detection' => env('NPLUSONE_FAIL_ON_DETECTION', false),
Eager Loading Patterns:
$posts = Post::with('author', 'comments.user')->get(); // Based on detector output
Middleware-Based Detection:
// app/Http/Middleware/LogNPlusOne.php
public function handle($request, Closure $next) {
if (app()->environment('production')) {
\Saasscaleup\NPlusOneDetector\Facades\NPlusOneDetector::detect();
}
return $next($request);
}
Performance Overhead:
NPLUSONE_DETECTOR_ENABLED=false
php artisan nplusone:detect) for one-off scans.False Positives:
'ignored_routes' => [
'posts.*', // Ignore all post-related routes
],
Database-Specific Quirks:
ignored_queries config:
'ignored_queries' => [
'select * from "users" where "users".*->>\'metadata\'',
],
Dashboard Access:
Route::middleware(['auth'])->group(function () {
Route::get('/nplusone-dashboard', [NPlusOneDetectorController::class, 'index']);
});
Log Inspection:
storage/logs/nplusone.log for detailed query traces. Example entry:
[N+1 Detected] Query: SELECT * FROM `posts` WHERE `posts`.`id` IN (1, 2, 3)
Parent Query: SELECT * FROM `users` WHERE `users`.`id` = 1
Relationship: posts
Query Filtering:
--filter flag to focus on specific routes or models:
php artisan nplusone:detect --filter="posts.*"
Exclusion Strategies:
/**
* @nplusone:ignore
*/
public function complexReport() { ... }
Custom Notifications:
// app/Providers/NPlusOneDetectorServiceProvider.php
public function boot() {
$this->app->make(\Saasscaleup\NPlusOneDetector\Contracts\Notification::class)
->extend('slack', function () {
return new SlackNotification();
});
}
Dashboard Customization:
resources/views/vendor/nplusone-detector/ to add custom metrics or charts.Query Analysis:
nplusone.detected event to log custom metrics:
\Saasscaleup\NPlusOneDetector\Events\NPlusOneDetected::class => [
\App\Listeners\LogNPlusOneMetrics::class,
],
How can I help you explore Laravel packages today?