0

0

Laravel ORM对Model::find方法进行缓存

不言

不言

发布时间:2018-06-07 10:06:27

|

1488人浏览过

|

来源于php中文网

原创

这篇文章主要给大家介绍了关于laravel orm对model::find方法进行缓存的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。

前段时间做项目时候,想要在不改变方法签名的情况下,给 Model::find 方法做个缓存。而且想要做到即插即用。下面话不多说了,来一起看看详细的介绍哦。

1.先看一下当我们调用 find 方法时,框架干了什么?

找到 Illuminate\Database\Eloquent\Model 的代码,搜索 find,没有该方法。看来是走了 __callStatic 这个魔术方法。该方法里只有一行代码:

return (new static)->$method(...$parameters);

static 指的是调用该静态方法的类(如果使用的是 UserModel::find(1),则 static 就代表 UserModel 类)。看来是实例化了一个对象,并调用了成员方法。

2.分析如何优雅地在中间插一脚

为了能够在调用 find 时候,先走我们的缓存,所以我们需要覆盖 __callStatic 方法,并检测如果是 find 方法,则优先返回缓存中的数据。

另外,为了能够达到即插即用的效果,我们使用继承的方式,而是使用了 Trait。核心逻辑如下:

public static function create($data = null){
 if ($data == null){
  return null;
 }
 $instance = new static;
 foreach ($data as $key => $value){
  $instance[$key] = $value;
 }
 return $instance;
}

/**
 * 如果方法是 find($id, $nocache)
 *
 * @param string $method
 * @param array $parameters
 * @return mixed
 */
public static function __callStatic($method, $parameters)
{
 if ($method == 'find'){
  // 从缓存中获取数据
  $obj = static::create(json_decode(Redis::get(static::getCacheKey($parameters[0])), true));
  if (null == $obj){
   $obj = (new static)->$method(...$parameters);
   if (null == $obj){
    return null;
   } else {
    $key = static::getCacheKey($parameters[0]);
    // 设置缓存及过期时间
    Redis::set($key, $obj);
    Redis::expire($key, static::$expire_time);
    return $obj;
   }
  } else {
   $obj->exists = true;
   return $obj;
  }
 } else if($method == 'findNoCache'){
  $method = 'find';
  return (new static)->$method(...$parameters);
 }
 return (new static)->$method(...$parameters);
}

private static function getCacheKey($id){
 $name = str_replace('\\', ':', __CLASS__);
 return "{$name}:{$id}";
}

大体逻辑上面已经介绍过了:覆盖 __callStatic 方法,判断如果是调用 find ,则走缓存(无缓存,查询后需要设置缓存)。另新增 findNoCache 方法。

Grokipedia
Grokipedia

xAI推出的AI在线百科全书

下载

3.细节补充

当修改(或删除)数据(调用 save 方法)时需要删除已缓存的内容。

private static function clearCache($id){
 Redis::del(self::getCacheKey($id));
}

/**
 * when save, should clear cache
 * @param array $options
 */
public function save(array $options = []){
 static::clearCache($this[$this->primaryKey]);
 return parent::save($options);
}
// delete 方法我暂时写,内容类似 save 方法

如何使用。在需要使用 find 缓存的 Model 类里,加上一行就够了。

class User extends BaseModel
{
 use MemoryCacheTrait;
}

快去试试吧。

相关推荐:

Laravel框架实现利用中间件进行操作日志记录功能

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

7

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

3

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

1

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

16

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

18

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号