Leveraging Component Caching with Computed Properties in Laravel Livewire
Last updated on by Eric L. Barnes
The Laravel News homepage has various sections displaying the latest articles, trending articles, recently covered packages, newly released tutorials, and more. Each section fetches its data through computed properties on our Homepage component.
As a result, this process causes numerous queries for a single page and here is video showing how we solved caching these. Or read on to see how we did with it in article format...
Here is an example of one of those computed sections that pulls the articles out:
public function recent(): Collection{ return Article::active() ->latest() ->limit(6) ->get();}
In our case, the landing page generates nearly 20-25 queries, which seems unnecessary.
Does the most frequently visited page on the site need to run that many queries?
Of course not!
That's where component caching comes in. Laravel Livewire has several ways of caching to enhance efficiency while reducing resource usage.
The simplest is to just throw a cache:true
to the computed property:
#[Computed(cache: true)]public function recent(): Collection{ return Article::active() ->latest() ->limit(6) ->get();}
Livewire will cache this for one hour and then be cleared by default. However, what if you have a lot of sections but only need to clear the cache on one? This style will only work if you clear all the cache.
In the newest Livewire release, you can now pass your own key so you can have fine-grained control over clearing the cache:
#[Computed(cache: true, key: 'home-recent')]public function recent(): Collection{ return Article::active() ->latest() ->limit(6) ->get();}
With this in place, you can now clear using the key like this:
Cache::forget('home-recent');
Computed properties, in tandem with caching, can indeed be extremely powerful! Adding keys to them enhances their potential significantly. It provides greater flexibility in controlling the cache.
For more information about this view the Livewire docs.
Eric is the creator of Laravel News and has been covering Laravel since 2012.