eusonlito/laravel-database-cache
Installation
composer require eusonlito/laravel-database-cache
Publish the config file:
php artisan vendor:publish --provider="Eusonlito\DatabaseCache\DatabaseCacheServiceProvider" --tag="config"
Basic Configuration
Edit config/database-cache.php to define:
'enabled' => env('DATABASE_CACHE_ENABLED', true),
'cache_driver' => env('DATABASE_CACHE_DRIVER', 'database'),
'cache_prefix' => 'db_cache_',
'ttl' => 60, // Default TTL in seconds
First Use Case Cache a simple Eloquent query:
use Eusonlito\DatabaseCache\Facades\DatabaseCache;
$users = DatabaseCache::remember('users.active', 300, function () {
return User::where('active', true)->get();
});
config/database-cache.php – Configuration options.src/Facades/DatabaseCache.php – Main facade for caching queries.src/Traits/DatabaseCacheTrait.php – Eloquent model trait for caching.Use the facade for ad-hoc caching:
// Cache a query for 1 hour
$posts = DatabaseCache::remember('posts.featured', 3600, function () {
return Post::where('featured', true)->with('author')->get();
});
Attach the trait to models for automatic caching:
use Eusonlito\DatabaseCache\Traits\DatabaseCacheTrait;
class User extends Model
{
use DatabaseCacheTrait;
protected $cacheKey = 'users';
}
Now, queries like User::all() will cache results under users.all.
Cache raw query builder results:
$results = DatabaseCache::remember('products.in_stock', 1800, function () {
return DB::table('products')->where('stock', '>', 0)->get();
});
Use closures or dynamic keys for context-aware caching:
$cacheKey = "reports.sales.{$year}";
$report = DatabaseCache::remember($cacheKey, 3600, function () use ($year) {
return Report::whereYear('created_at', $year)->sum('revenue');
});
Manually clear cached queries:
DatabaseCache::forget('users.active');
DatabaseCache::clear(); // Clears all cached queries
Skip caching in development:
if (app()->environment('production')) {
$data = DatabaseCache::remember('...', 3600, $callback);
} else {
$data = $callback();
}
Use tags for bulk invalidation (requires custom implementation):
// Example: Tag-based invalidation (extend the package)
DatabaseCache::tag(['users', 'active'])->remember('...', ...);
Handle cache misses gracefully:
$data = DatabaseCache::remember('expensive_query', 3600, function () {
return DB::table('large_table')->get();
}, function () {
return collect(); // Fallback empty collection
});
User::all() and User::query()->get()).protected function getCacheKey()
{
return "users.{$this->getQuery()->toSql()}";
}
local environment can hide query changes.'enabled' => app()->environment('production'),
User::all()) can bloat memory.$users = DatabaseCache::remember('users.paginated', 3600, function () {
return User::paginate(50);
});
$users = DatabaseCache::remember('users.with_roles', 3600, function () {
return User::with('roles')->get();
});
cache_lock or database driver with transactions:
'cache_driver' => 'database', // Uses DB transactions
Enable logging in config/database-cache.php:
'log_enabled' => true,
Check storage/logs/laravel.log for cache events.
Query the cache table directly:
SELECT * FROM cache WHERE key LIKE 'db_cache_%';
Use Artisan commands or facade:
php artisan cache:clear
Or:
DatabaseCache::clear();
Set custom TTL for specific queries:
DatabaseCache::remember('volatile_data', 60, $callback); // 1-minute TTL
Extend the package to support Redis or Memcached:
// config/database-cache.php
'cache_driver' => 'redis',
Ensure the driver is configured in config/cache.php.
Publish the package’s event handlers:
php artisan vendor:publish --provider="Eusonlito\DatabaseCache\DatabaseCacheServiceProvider" --tag="events"
Listen for DatabaseCacheStored and DatabaseCacheMissed events.
Store additional metadata (e.g., query hash, timestamp):
DatabaseCache::remember('data', 3600, $callback, [], [
'query_hash' => md5($callback->toSql())
]);
Cache search results:
$searchResults = DatabaseCache::remember("search:{$query}", 3600, function () use ($query) {
return Product::search($query)->get();
});
Use Laravel Queues to populate cache in the background:
DatabaseCache::dispatch('expensive_query', 86400, $callback);
How can I help you explore Laravel packages today?