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

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

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

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

这是这个技术的要点:

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

$article->comments->count() {{ str_plural('Comment', $article->comments->count())

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

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

$article->cached_comments_count {{ str_plural('Comment', $article->cached_comments_count)

通过使用模型访问器,我们可以缓存基于最后一次文章更新的评论计数值。

因此,在评论新增或删除时我们该怎么更新文章的 updated_at 列值呢?

先进入 touch 方法看看。

模型的触发

可以通过使用模型的 touch() 方法来更新文章的 updated_at 列值:

$ php artisan tinker

>>> $article = AppArticle::first();=> AppArticle {#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 。下面是我们的评论模型的大概样子:

belongsTo(Article::class);    }}

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

缓存的属性

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

public function getCachedCommentsCountAttribute(){    return Cache::remember($this->cacheKey() . ':comments_count', 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 模型的完整代码:

getTable(),            $this->getKey(),            $this->updated_at->timestamp        );    }    public function comments()    {        return $this->hasMany(Comment::class);    }    public function getCachedCommentsCountAttribute()    {        return Cache::remember($this->cacheKey() . ':comments_count', 15, function () {            return $this->comments->count();        });    }}

然后是关联的 Comment 模型:

belongsTo(Article::class);    }}

接下来做什么?

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

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

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

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

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

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

以上就是在 Laravel 中如何在 Model 层进行数据缓存?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/88464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月17日 23:11:12
下一篇 2025年11月17日 23:47:52

相关推荐

  • Codatta(XNY币)是什么?XNY代币经济学、价格预测介绍

    Codatta 是什么?解决 AI 时代的核心痛点 Codatta 定位于 AGI(通用人工智能)的可扩展数据通道,利用区块链技术打造去中心化数据协议。它连接数据提供者与 AI 开发者,将原始信息转化为可验证、可资产化的数据资源,直面传统中心化数据市场的四大难题: 数据溯源困难:无法确认来源与真实性…

    2025年12月8日
    000
  • 以太坊交易员预计ETH价格将在本周期达到1.6万美元

    目录 要点摘要:以太坊技术面暗示ETH价格或将冲击五位数现货以太坊ETF持续18日资金净流入 ‍以太坊正构筑一个上升三角形突破结构,潜在价格目标指向约16,700美元。 要点摘要: 尽管以太坊在4,000美元区域遭遇阻力,但强劲的技术信号与不断上升的机构兴趣可能推动ETH进入新一轮价格发现阶段。上升…

    2025年12月8日 好文分享
    000
  • 什么是OLAXBT(AIO币)?值得投资吗?OLAXBT项目概述,代币经济,前景分析

    目录 OLAXBT项目定位OLAXBT核心技术OlaXBT最新动态AIO代币经济代币分配解锁时间表代币效用OLAXBT生态进展OLAXBT风险管理与应对措施OLAXBT未来规划常见问题总结 olaxbt(aio)是一款将 ai 驱动的量化策略与去中心化交易协议结合的 web3 平台,旨在通过预制与自…

    2025年12月8日 好文分享
    000
  • 以太坊(ETH)衍生品缺乏动力,引发对冲击4000美元反弹的质疑

    目录 要点摘要:ETH交易者情绪低迷,因以太坊TVL下滑 ‍尽管etf资金持续流入,但由于竞争加剧与链上活动乏力,eth市场参与者仍保持谨慎。 要点摘要: 尽管ETH价格反弹且ETF资金流入强劲,衍生品数据表明交易者情绪仍偏保守。以太坊面临来自Solana和BNB Chain的竞争压力,同时自身网络…

    2025年12月8日 好文分享
    000
  • Layer2 混战再起:Linea 代币上线,是机会还是鸡肋?

    备受关注的以太坊二层网络Linea终于正式推出其原生代币。 根据项目团队发布的最新公告,我整理出一些对普通用户尤为重要的信息点: – 代币总供应量约为720亿枚– 其中9%将通过空投形式发放给早期用户…… 目前,LINEA代币在系统中尚未赋予具体用途,既不作为交易手续费支付(…

    2025年12月8日
    000
  • 以太坊十周年:7 大维度揭秘为何 ETH 涨势才刚开始?

    一、ETH储备概念股 近期以太坊市场买气旺盛,多家上市公司与资产管理机构纷纷增持,甚至将ETH纳入核心财务战略。与此同时,ETH储备相关概念股在美股市场表现抢眼,成为资本新宠。 华尔街知名策略师、Fundstrat联合创始人Thomas Lee的动向成为关键催化剂。他于2025年出任Bitmine董…

    2025年12月8日 好文分享
    000
  • 2025山寨币投资指南:哪些关键指标值的关注?

    目录 叙事与市场契合度及高关注度增长的指标合理的Token经济学 即将解锁的token Token效用 以社区为中心的理念 总结 牛市行情回来了(至少目前看来如此)。 但关键问题是:哪些山寨币最有可能成为本轮周期中的领跑者? 回顾2021年的牛市,几乎任何项目都能迎来大幅上涨。然而,时过境迁,如今市…

    2025年12月8日
    000
  • Kraken即将IPO上市,有哪些标的可以炒作?

    Pre-IPO 投资热潮来袭,散户也能抢跑上市前 随着 OpenAI、SpaceX 等顶尖科技企业长期保持私有状态,大量早期员工与投资人希望在正式IPO前实现股权变现。而 Forge 正是连接“出售方”与“提前布局投资者”的关键平台。当前 Kraken 上市预期持续升温,一旦其内部股东或机构开始释放…

    2025年12月8日 好文分享
    000
  • XRP价格预测:XRP可能正准备展开下一波牛市

    XRP或迎来新一轮上涨周期,近期走势为看涨预测提供了技术支撑。 在7月中旬经历约20%的回调后,XRP价格在2.90美元区域展现出强劲支撑,构筑出双底结构。这一经典技术形态通常预示趋势反转,暗示市场买盘正在回归。 然而,整体宏观环境仍存不确定性。美联储7月选择暂停加息,采取观望策略,同时新关税政策引…

    2025年12月8日 好文分享
    000
  • ATOR Protocol(ATOR币)是什么?ATOR币未来前景及价格分析

    目录 什么是ATOR协议?ATOR协议的特点白名单访问和质押匿名性ATOR协议(ATOR)的用途是什么?什么是ATOR代币?ATOR Protocol如何运作?Airtor Protocol (ATOR)特点ATOR币未来前景如何?技术前景市场前景应用前景ATOR币是一项好的投资吗?ATOR Pro…

    2025年12月8日
    000
  • InterLink(ITLG币)是什么?值得投资吗?ITLG代币经济学和未来展望

    目录 项目定位是什么? 核心技术的关键特点是什么? InterLink 的 ITLG 代币经济学:它是如何设计的? 代币实用程序: 迄今为止生态系统进展如何? InterLink 如何管理风险和应对挑战? InterLink 的未来计划是什么? 常问问题 关键要点 InterLink 致力于构建全球…

    2025年12月8日
    000
  • 以太坊(Ethereum)研究员提出“精简”网络应对量子时代

    以太坊基金会研究人员Justin Drake近日提出名为“精简以太坊”(Slim Ethereum)的新倡议,目标是提升以太坊主网的速度与量子抗性,同时大幅降低其底层技术架构的复杂度。 该计划聚焦于重构以太坊的三大核心层级:共识层、数据层和执行层。Drake建议引入一种基于零知识证明的虚拟机,能够在…

    2025年12月8日
    000
  • MoMo.fun(MM币)是什么?是一个好投资吗?MM币价格预测与空投领取指南

    目录 MOMO.FUN是什么MOMO.FUN核心功能与优势AI Agent:智能化的核心驱动力AI Pool:智能化的募资与流动性管理Eliza 框架:链上链下的智能交互桥梁MemeFi 模式:打造 Meme + DeFi 的完美结合MOMO.FUN空投领取MM币价格预测Momofun 2025 年…

    2025年12月8日
    000
  • 山寨币季节指数 2025年:一文预测加密货币市场的繁荣

    目录 山寨币季节指数解析:交易者的关键指标山寨币指数如何运作:计算 2025 年的市场变化过去的山寨币季节:从以往的加密货币市场周期中吸取的教训加密货币市场趋势:过去山寨币季度指数数据的关键洞察2025 年山寨币季节即将来临,主要指标如何利用指数判断山寨币旺季何时开始?比特币主导地位 vs. 山寨币…

    2025年12月8日
    000
  • 欧易okx交易平台官方版App注册入口 欧易官方app安装注册下载链接及步骤汇总

    欧易OKX交易平台是一款全球领先的数字资产交易应用,提供现货交易、合约交易、理财等多种服务。本文为您准备了欧易官方App下载入口,用户只需点击本文提供的官方链接即可快速下载安装,安全开启数字货币交易体验。为了帮助新用户顺利完成安装与注册,下面将详细介绍完整步骤。 下载安装步骤 1、点击本文提供的,进…

    2025年12月8日 好文分享
    000
  • 欧易交易所APP安卓版 v6.132.0 欧易APP官网下载安装指南2025

    欧易(OKX)是一款全球知名的数字资产综合服务平台,为广大用户提供涵盖现货、合约、期权等在内的多元化产品和服务。其官方APP凭借流畅的操作体验和强大的功能集成,成为了许多数字资产用户的常用工具。 本文为您整理了欧易交易所app安卓最新版的官网下载安装指南,点击本文中提供的官方下载链接,即可安全快速地…

    2025年12月8日 好文分享
    000
  • oyi交易所app安卓下载链接 欧意交易平台官方app手机端详细安装注册教程

    欧易交易所是一款全球领先的数字资产交易平台,为用户提供多样化的数字货币交易服务。本文将为您提供欧易交易平台安卓手机端网址,点击本文中的下载链接即可轻松下载安装。下文还将详细介绍安装和注册的具体流程,帮助您快速开启数字资产交易之旅。 欧易App下载与安装步骤 1、点击本文提供的 ,系统会自动开始下载。…

    2025年12月8日 好文分享
    000
  • 安全购买稳定币的窍门

    什么是稳定币? 稳定币是一种特殊类型的加密货币,其价值旨在保持稳定,通常通过与某种外部资产(例如美元或黄金)挂钩来实现。这种挂钩使得稳定币的价值波动远小于比特币或以太坊等其他加密货币,从而使其成为在加密市场中对冲波动性风险、进行套利交易以及快速转移资金的理想工具。 稳定币通常与法定货币(如美元)以1…

    2025年12月8日
    000
  • 稳定币市值占加密货币市场 7.48%,规模持续扩张

    稳定币市值扩张由多因素驱动,1.市场避险需求;2.DeFi生态繁荣;3.跨境支付需求;4.机构投资者入场;5.新兴经济体需求;6.技术和监管成熟;7.支付场景拓展;8.利息收益机会。其通过法币抵押、加密资产抵押或算法机制实现价格稳定,其中法币抵押型如USDT、USDC、BUSD,加密抵押型如DAI,…

    2025年12月8日
    000
  • 稳定币在跨境支付领域的应用前景与挑战

    稳定币在跨境支付中具有显著优势,1. 能降低交易成本;2. 提高交易速度;3. 实现全天候服务;4. 减少汇率风险;5. 增强交易透明度;6. 提升金融可及性。其主流类型为法币抵押型稳定币,如USDT和USDC,广泛应用于全球跨境转账。然而,其发展仍面临三大挑战:1. 监管框架不完善,包括法律定性模…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信