在Laravel中缓存查询的更优雅或更高效的方法是什么


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

这就是目前缓存查询的方式,我认为当更新后表中的数据发生变化时,很难使用模型事件来更新缓存,因为我需要更新多个缓存。

<?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;
    }
}

这样做对吗?我面临的挑战是如何在记录更改时更新缓存

我想知道是否有可能为所有记录只保留一个缓存,并且能够在没有正在访问数据库。

 $books = Cache::get('books');
 $book = $books->find(1);
 $published = $books->where('published', 1)->get();

这样,当使用模型事件更新表后记录发生更改时,我只能更新一次缓存"books"

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