Reputation: 1521
On News Website, I have an Article model, and I want to cache the latest articles since I expect they have the highest hits. How can I write a method that operates in this way:
public function findById($id)
{
if(Article::inMemory($id))
return Article::findFromMemory($id);
return Article::find($id);
}
If there are any better approaches, please mention them as well
Upvotes: 15
Views: 2707
Reputation: 3517
Laravel has a feature explicitly for this scenario, called Retrieve Or Update:
use Cache;
public function findById($id)
{
return Cache::rememberForever("article-$id", function () use ($id) {
return Article::find($id);
});
}
This will cache and return the closure's returned value, otherwise executing the closure to populate the cache if needed.
Upvotes: 4
Reputation: 1952
use Cache;
public function findById($id)
{
if ($articleInCache = Cache::get('article-' . $id)) {
return $articleInCache;
}
return Article::find($id);
}
There are multiple memory drivers you can use and you can determine how you want to store the values in memory. Above, it assumes you stored the value with the 'article-' . $id (such as "article-5" as the key). It's up to you.
Check out the docs: https://laravel.com/docs/master/cache
Check out Laracasts: https://laracasts.com/series/real-time-laravel-with-socket-io/episodes/2
Upvotes: 3