Category : Laravel Performance & Optimization Publish At : 16 Oct, 2025
Introduction
Fetching categories from the database every time a page loads might sound simple, but it quickly becomes a performance bottleneck—especially when your app grows or traffic spikes.
Laravel provides a clean solution to this: caching your categories, and automatically refreshing that cache whenever a category is created, updated, or deleted.
In this guide, we’ll see how to implement it step-by-step so your categories always load instantly without stale data.
Step 1: Cache Categories When Needed
use Illuminate\Support\Facades\Cache;
use App\Models\Category;
$categories = Cache::rememberForever('categories', function () {
return Category::orderBy('name')->get();
});
Explanation
rememberForever
stores the categories indefinitely until manually cleared.Step 2: Automatically Refresh Cache on Create, Update, or Delete
Whenever a category changes, we need to refresh the cache.
You can handle this easily in the Category
model’s events.
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
class Category extends Model
{
protected static function booted()
{
static::created(fn() => self::refreshCache());
static::updated(fn() => self::refreshCache());
static::deleted(fn() => self::refreshCache());
}
public static function refreshCache()
{
Cache::forget('categories');
Cache::rememberForever('categories', function () {
return self::orderBy('name')->get();
});
}
}
What this does:
Step 3: Use Cached Categories Everywhere
$categories = Cache::get('categories');
Or better yet, use a global helper or a view composer:
View::composer('*', function ($view) {
$view->with('categories', Cache::get('categories'));
});
Pro Tip: Use Tags (Optional)
If you have multiple cache sections, you can use cache tags for better grouping:
Cache::tags(['categories'])->rememberForever('all', function () {
return Category::all();
});
Cache::tags(['categories'])->flush(); // to clear all related cache