If you’ve ever had a Laravel app slow to a crawl—or worse, crash—because your database was stuffed with years of invoices, logs, or expired sessions, you’re not alone.
In 2026, Laravel’s Model Pruning feature is more powerful than ever. It lets you automatically delete old or irrelevant records using elegant, built-in traits. No more writing custom cleanup scripts or manually purging tables.
Let’s dive into how to use Prunable and MassPrunable to keep your app healthy and your database fast.
🧠 What Is Model Pruning?
Model Pruning is Laravel’s way of saying: “Let’s clean up your database before it becomes a liability.”
It works by attaching a trait to your Eloquent model and defining a query that selects records to delete. Laravel then runs this query on a schedule—automatically.
⚙️ Setup: Pruning Old Invoices
Let’s say you want to delete invoices older than 2 years.
Step 1: Add the Prunable trait
use Illuminate\Database\Eloquent\Prunable;
class Invoice extends Model
{
use Prunable;
public function prunable(): Builder
{
return static::where('created_at', '<', now()->subYears(2));
}
}
This tells Laravel: “Any invoice older than 2 years is fair game for deletion.”
Step 2: Schedule the Pruning
In your App\Console\Kernel.php:
protected function schedule(Schedule $schedule)
{
$schedule->command('model:prune')->daily();
}
This runs the pruning command every day. You can change it to weekly or monthly depending on your needs.
⚡ MassPrunable: For Huge Tables
If your table has millions of rows, use MassPrunable instead. It’s optimized for bulk deletion.
use Illuminate\Database\Eloquent\MassPrunable;
class LogEntry extends Model
{
use MassPrunable;
public function prunable(): Builder
{
return static::where('created_at', '<', now()->subDays(30));
}
}
This will delete logs older than 30 days using a single SQL query—much faster and safer.
🧪 Real-World Use Cases
| Model | Pruning Rule | Trait |
|---|---|---|
| Invoice | Older than 2 years | Prunable |
| LogEntry | Older than 30 days | MassPrunable |
| Session | Expired or inactive for 7+ days | Prunable |
| TempUpload | Created more than 24 hours ago | MassPrunable |
| Notification | Read and older than 90 days | Prunable |
🧩 Advanced Tips
- Use
withoutOverlapping()in your schedule to prevent duplicate runs. - Tag your pruning jobs for better monitoring in Horizon.
- Trigger manually with
php artisan model:prune --model=App\\Models\\Invoice. - Log pruning events using Laravel’s event system:
protected static function booted()
{
static::pruned(function ($model) {
Log::info('Pruned: ' . get_class($model));
});
}
🔐 Safety Considerations
- Always test pruning queries before deploying.
- Use soft deletes if you want to keep a backup.
- Monitor disk usage and query performance with tools like Laravel Telescope or Horizon.
🔮 What’s New in Laravel 2026?
- Pruning Preview Mode: See what would be deleted before running.
- Cloud-native pruning: Works with S3, Redis, and external queues.
- AI-assisted pruning (experimental): Suggests pruning rules based on usage patterns.
🔑 Final Thoughts
Laravel’s Model Pruning is one of the most underrated features in the framework. It helps you:
- Keep your database lean
- Avoid performance bottlenecks
- Reduce hosting costs
- Improve app reliability
If you’re building a SaaS, e-commerce platform, or internal tool, pruning isn’t optional—it’s essential.
