您在此之前可能就已经缓存过模型数据,但是我将向您展示一个使用动态记录模型的更精细的Laravel模型缓存技术,这是我一开始在 RailsCasts学习到的技术。
使用模型的唯一缓存键,您可以缓存模型(或关联模型)更新时自动更新(以及缓存失效)的模型上的属性和关联,一个好处是访问缓存的数据比在控制器中缓存的数据更具可复用性,因为它在模型上而不是在单个控制器方法中。
这是这个技术的要点:
假设你有很多个 Comment
的 Article
模型,给定下面的Laravel blade 模板,你就可以像下面这样访问 /article/:id
路由时得到评论的数量:
<h3>$article->comments->count() {{ str_plural('Comment', $article->comments->count())</h3>
您可以在控制器中缓存评论的计数,但是当您有多个需要缓存的一次性查询和数据时,控制器会变得非常臃肿难看。使用控制器,访问缓存的数据也不是很方便。
我们可以构建一个模板,它仅在文章更新时访问数据库,并且访问该模型的所有代码都可以获取缓存值:
<h3>$article->cached_comments_count {{ str_plural('Comment', $article->cached_comments_count)</h3>
通过使用模型访问器,我们可以缓存基于最后一次文章更新的评论计数值。
因此,在评论新增或删除时我们该怎么更新文章的 updated_at
列值呢?
先进入 touch 方法看看。
模型的触发
可以通过使用模型的 touch()
方法来更新文章的 updated_at
列值:
$ php artisan tinker >>> $article = \App\Article::first(); => App\Article {#746 id: 1, title: "Hello World", body: "The Body", created_at: "2018-01-11 05:16:51", updated_at: "2018-01-11 05:51:07", } >>> $article->updated_at->timestamp => 1515649867 >>> $article->touch(); => true >>> $article->updated_at->timestamp => 1515650910
我们可以用更新的 timestamp 值使缓存失效。不过在新增或删除一个评论时,我们怎么触发修改文章的 updated_at
字段呢?
碰巧 Eloquent 模型中有一个属性就叫 $touches
。下面是我们的评论模型的大概样子:
<?php namespace App; use App\Article; use Illuminate\Database\Eloquent\Model; class Comment extends Model { protected $guarded = []; protected $touches = ['article']; public function article() { return $this->belongsTo(Article::class); } }
内容版权声明:除非注明,否则皆为本站原创文章。