Installation:
composer require neurony/laravel-query-cache
Publish the config file:
php artisan vendor:publish --provider="Neurony\QueryCache\QueryCacheServiceProvider"
Update .env to use a compatible cache driver (e.g., REDIS_CACHE=redis).
Enable Caching:
Add the model to config/query-cache.php under models:
'models' => [
'App\Models\User' => [
'cache_all' => true, // Cache all queries
// OR
'cache_duplicates' => true, // Cache only duplicates
],
],
Or enable globally in config/query-cache.php:
'cache_all' => true,
First Use Case:
Run a query on a cached model (e.g., User::all()). Subsequent identical queries will return cached results.
Model-Specific Caching:
cache_all to cache every select query for a model (e.g., dashboard metrics).cache_duplicates to cache only repeated queries (e.g., user profiles in loops).Query Tagging:
model:App\Models\User:query:select*fromusers).QueryCache::clear('App\Models\User');
Integration with Eloquent:
where, with, orderBy, etc.:
$users = User::where('active', true)->orderBy('name')->get(); // Cached if enabled
Dynamic Model Registration:
QueryCache::enableForModel(User::class, ['cache_duplicates' => true]);
Conditional Caching:
use Neurony\QueryCache\Traits\DisableQueryCache;
class UserController {
use DisableQueryCache;
public function sensitiveData() {
$this->disableQueryCache();
return User::where('secret', true)->get();
}
}
Incompatible Cache Drivers:
file or database drivers throw RuntimeException.redis, memcached, or array (for testing only).Cache Key Collisions:
with) may generate identical hashes for different queries.cache_duplicates sparingly.TTL Management:
cache_ttl in config/query-cache.php).Memory Usage:
Product) can bloat Redis.cache_duplicates or exclude models with high query variance.Testing Quirks:
setUp():
public function setUp(): void {
QueryCache::clearAll();
parent::setUp();
}
Log Cache Hits/Misses: Enable debug mode in config:
'debug' => env('QUERY_CACHE_DEBUG', false),
Check Laravel logs for entries like:
[QueryCache] Cache hit for App\Models\User (query: select * from users where active = ?)
Inspect Cache Keys: Dump keys manually:
$key = QueryCache::generateKey(User::class, User::query()->toSql());
cache()->get($key);
Bypass Cache Temporarily:
Use the DisableQueryCache trait or environment flag:
QUERY_CACHE_ENABLED=false
Custom Cache Key Generation: Override the key generator in a service provider:
QueryCache::setKeyGenerator(function ($model, $query) {
return "custom:{$model}:{$query->toSql()}:".md5($query->getBindings());
});
Post-Cache Hooks:
Listen for cache events (e.g., QueryCached):
QueryCache::addListener('QueryCached', function ($model, $query, $cacheKey) {
Log::info("Cached query for {$model} with key {$cacheKey}");
});
Conditional Caching Logic:
Extend the QueryCache class to add rules (e.g., cache only during off-peak hours):
QueryCache::shouldCache(function ($model, $query) {
return now()->hour() < 8; // Cache only before 8 AM
});
How can I help you explore Laravel packages today?