cari
Rumahrangka kerja phpLaravel在 Laravel 中如何在 Model 层进行数据缓存?

在 Laravel 中如何在 Model 层进行数据缓存?

您在此之前可能就已经缓存过模型数据,但是我将向您展示一个使用动态记录模型的更精细的 Laravel 模型缓存技术,这是我一开始在 RailsCasts 学习到的技术。

使用模型的唯一缓存键,您可以缓存模型(或关联模型)更新时自动更新(以及缓存失效)的模型上的属性和关联,一个好处是访问缓存的数据比在控制器中缓存的数据更具可复用性,因为它在模型上而不是在单个控制器方法中。

这是这个技术的要点:

假设你有很多个 Comment 的 Article 模型,给定下面的 Laravel blade 模板,你就可以像下面这样访问 /article/:id 路由时得到评论的数量:

<h3>$article->comments->count() {{ str_plural(&#39;Comment&#39;, $article->comments->count())</h3>

您可以在控制器中缓存评论的计数,但是当您有多个需要缓存的一次性查询和数据时,控制器会变得非常臃肿难看。使用控制器,访问缓存的数据也不是很方便。

我们可以构建一个模板,它仅在文章更新时访问数据库,并且访问该模型的所有代码都可以获取缓存值:

<h3>$article->cached_comments_count {{ str_plural(&#39;Comment&#39;, $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 = [&#39;article&#39;];
    public function article()
    {
        return $this->belongsTo(Article::class);
    }
}

这里的 $touches 属性是个数组,包含了在评论的创建、保存和删除时会引起 “触发” 的关联信息。

缓存的属性

我们先回到 $article->cached_comments_count 访问器。该方法的实现可能象 App\Article 模型中的样子:

public function getCachedCommentsCountAttribute()
{
    return Cache::remember($this->cacheKey() . &#39;:comments_count&#39;, 15, function () {
        return $this->comments->count();
    });
}

我们使用唯一键值的 cacheKey() 方法缓存模型 15 分钟,然后简单地在闭包方法中返回评论计数值。

注意,我们也用到了 Cache::rememberForever() 方法,靠着缓存机制的垃圾回收策略以删除过期的键值。我设置了一个定时器,以便在每隔 15 分钟的缓存刷新间隔里,缓存可在该时间的多数范围内有最高的命中率。

cacheKey() 方法要用到模型的唯一键值,并且在模型更新时对应缓存失效。下面是我的 cacheKey 实现代码:

public function cacheKey()
{
    return sprintf(
        "%s/%s-%s",
        $this->getTable(),
        $this->getKey(),
        $this->updated_at->timestamp
    );
}

模型的 cacheKey() 方法示例输出结果可能返回下面的字串信息:

articles/1-1515650910

这个键值是由表名、模型 id 值及当前 updated_at 的 timestamp 值组成。一旦我们触发这个模型,timestamp 值就会更新,并且我们的模型缓存就会相应地失效。

以下是 Article 模型的完整代码:

<?php
namespace App;
use App\Comment;
use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
    public function cacheKey()
    {
        return sprintf(
            "%s/%s-%s",
            $this->getTable(),
            $this->getKey(),
            $this->updated_at->timestamp
        );
    }
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
    public function getCachedCommentsCountAttribute()
    {
        return Cache::remember($this->cacheKey() . &#39;:comments_count&#39;, 15, function () {
            return $this->comments->count();
        });
    }
}

然后是关联的 Comment 模型:

<?php
namespace App;
use App\Article;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
    protected $guarded = [];
    protected $touches = [&#39;article&#39;];
    public function article()
    {
        return $this->belongsTo(Article::class);
    }
}

接下来做什么?

我已经向你展示了如何缓存一个简单的评论计数,但是如何缓存所有的评论呢?

public function getCachedCommentsAttribute()
{
    return Cache::remember($this->cacheKey() . &#39;:comments&#39;, 15, function () {
        return $this->comments;
    });
}

你也可以选择将评论转换为数组替代序列化模型,只允许在前端对数据进行简单的数组访问:

public function getCachedCommentsAttribute()
{
    return Cache::remember($this->cacheKey() . &#39;:comments&#39;, 15, function () {
        return $this->comments->toArray();
    });
}

最后, 我在 Article 模型中定义了 cacheKey() 方法,但是你可能想要通过一个名为 ProvidesModelCacheKey 的 trait 来定义这个方法以便你可以在复合模型中使用或者在一个基础模型中定义所有模型扩展的方法。 你甚至可能想要为实现 cacheKey() 方法的模型使用使用契约 (接口)。

推荐教程:《PHP教程》《Laravel

Atas ialah kandungan terperinci 在 Laravel 中如何在 Model 层进行数据缓存?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:learnku. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Laravel dan backend: Powering Web Application LogicLaravel dan backend: Powering Web Application LogicApr 11, 2025 am 11:29 AM

Bagaimanakah Laravel memainkan peranan dalam logik backend? Ia memudahkan dan meningkatkan pembangunan backend melalui sistem penghalaan, eloquentorm, pengesahan dan kebenaran, acara dan pendengar, dan pengoptimuman prestasi. 1. Sistem penghalaan membolehkan definisi struktur URL dan logik pemprosesan permintaan. 2.eloquentorm memudahkan interaksi pangkalan data. 3. Sistem pengesahan dan kebenaran adalah mudah untuk pengurusan pengguna. 4. Acara dan pendengar melaksanakan struktur kod yang ditambah dengan longgar. 5. Pengoptimuman prestasi meningkatkan kecekapan aplikasi melalui caching dan beratur.

Mengapa Laravel begitu popular?Mengapa Laravel begitu popular?Apr 02, 2025 pm 02:16 PM

Populariti Laravel termasuk proses pembangunan mudahnya, menyediakan persekitaran pembangunan yang menyenangkan, dan ciri -ciri yang kaya. 1) Ia menyerap falsafah reka bentuk Rubyonrails, menggabungkan fleksibiliti PHP. 2) Menyediakan alat seperti eloquentorm, enjin templat bilah, dan lain -lain untuk meningkatkan kecekapan pembangunan. 3) Mekanisme suntikan seni bina dan ketergantungan MVC menjadikan kod lebih modular dan boleh diuji. 4) Menyediakan alat debugging yang kuat dan kaedah pengoptimuman prestasi seperti sistem caching dan amalan terbaik.

Mana yang lebih baik, Django atau Laravel?Mana yang lebih baik, Django atau Laravel?Mar 28, 2025 am 10:41 AM

Kedua-dua Django dan Laravel adalah kerangka kerja penuh. Django sesuai untuk pemaju python dan logik perniagaan yang kompleks, manakala Laravel sesuai untuk pemaju PHP dan sintaks elegan. 1.Django didasarkan pada python dan mengikuti falsafah "lengkap bateri", sesuai untuk perkembangan pesat dan kesesuaian yang tinggi. 2. Laravel didasarkan pada PHP, menekankan pengalaman pemaju, dan sesuai untuk projek kecil dan sederhana.

PHP atau Laravel mana yang lebih baik?PHP atau Laravel mana yang lebih baik?Mar 27, 2025 pm 05:31 PM

PHP dan Laravel tidak dapat dibandingkan secara langsung, kerana Laravel adalah rangka kerja berasaskan PHP. 1.Php sesuai untuk projek kecil atau prototaip cepat kerana ia mudah dan langsung. 2. Laravel sesuai untuk projek besar atau pembangunan yang cekap kerana ia menyediakan fungsi dan alat yang kaya, tetapi mempunyai lengkung pembelajaran yang curam dan mungkin tidak sebaik php tulen.

Adakah Laravel adalah frontend atau backend?Adakah Laravel adalah frontend atau backend?Mar 27, 2025 pm 05:31 PM

LaravelisabackendFramWorkBuiltonPHP, Direka ForweBapplicationDevelopment.itfocusesonServer-Sidelogic, DatabaseManagement, andApplications Structure, andCanbeIntegratedWithFrontendTechnologiesLikeVue.jsorreactorfull-stackdevelopment.

Bagaimana saya membuat dan menggunakan arahan pisau tersuai di laravel?Bagaimana saya membuat dan menggunakan arahan pisau tersuai di laravel?Mar 17, 2025 pm 02:50 PM

Artikel ini membincangkan membuat dan menggunakan arahan pisau tersuai di Laravel untuk meningkatkan templat. Ia meliputi arahan yang menentukan, menggunakannya dalam templat, dan menguruskannya dalam projek besar, menonjolkan manfaat seperti kebolehgunaan semula kod yang lebih baik dan r yang lebih baik dan r

Bagaimana saya menggunakan komponen Laravel untuk mencipta elemen UI yang boleh diguna semula?Bagaimana saya menggunakan komponen Laravel untuk mencipta elemen UI yang boleh diguna semula?Mar 17, 2025 pm 02:47 PM

Artikel ini membincangkan membuat dan menyesuaikan elemen UI yang boleh diguna semula di Laravel menggunakan komponen, menawarkan amalan terbaik untuk organisasi dan mencadangkan peningkatan pakej.

Bagaimanakah saya boleh menggunakan ciri penghalaan Laravel untuk membuat URL mesra SEO?Bagaimanakah saya boleh menggunakan ciri penghalaan Laravel untuk membuat URL mesra SEO?Mar 17, 2025 pm 02:43 PM

Artikel ini membincangkan menggunakan penghalaan Laravel untuk mewujudkan URL mesra SEO, meliputi amalan terbaik, URL kanonik, dan alat untuk pengoptimuman SEO.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma