简体   繁体   中英

What is more elegant or more efficient way to cache queries in Laravel

This is how am presently caching queries and i think it difficult to use model events to update cache when data change in tables after update because i need to update multiple caches.

<?php namespace App\Repositories;

use App\Models\Book; //my model
use \Cache;

class BookEloquentRepository implements BookRepositoryInterface{

    protected $cache_enabled = true;
    protected $cache_key = "book";


    public function __construct(Book $book){
        $this->book = $book;
    }


    public function find($id)
    {
        $this->cache_key = $this->cache_key ."_find_{$id}";

        if( $this->cache_enabled && Cache::has($this->cache_key) ) return Cache::get($this->cache_key);

        $books = $this->book->find($id);

        Cache::forever($this->cache_key, $books);

        return $books;
    }


    public function all()
    {
        $this->cache_key = $this->cache_key ."_all";

        if( $this->cache_enabled && Cache::has($this->cache_key) ) return Cache::get($this->cache_key);

        $books = $this->book->all();

        Cache::forever($this->cache_key, $books);

        return $books;
    }


    public function allPublished()
    {
        $this->cache_key = $this->cache_key ."_allPublished";

        if( $this->cache_enabled && Cache::has($this->cache_key) ) return Cache::get($this->cache_key);

        $books = $this->book->where('published', 1);

        Cache::forever($this->cache_key, $books);

        return $books;
    }
}

Is this the right way to do this? The challenge i have with these is how to update caches when record changes

I want to know if its possible to maintain only one cache for all records and be able to do stuffs like this without hitting the database.

 $books = Cache::get('books');

 $book = $books->find(1);

 $published = $books->where('published', 1)->get();

This way i can only update only once cache 'books' when record changes after table update using model events

$published = Cache::remember('published', $minutes, function() {
    return Book::where('published', 1)->get();
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM