Laravel等框架模型关联的可用性浅析


Posted in PHP onDecember 15, 2019

早期开发中,模型关联带来非常大的便利性。同时也提升了数据库查询效率(避免了重复查询,相关解释如 laravel 的 n+1 查询问题)。

比如说,获取用户信息的接口,接口中除了要返回 user 表的数据外,还需要返回类似 user_option 或者 user_info 等表的数据。这个时候用 laravel 的模型关联的形式如下:

class UserModel extends Model {
  protected $table = 'user';
  public $timestamps = false;
  
  public function userOption()
  {
    return $this->hasOne(UserOptionModel::class , 'user_id' , 'id');
  }
  
  public function findById(int $user_id)
  {
    $res = self::with(['user_option'])
      ->find($user_id);
    return $res;
  }
}

class UserOptionModel extends Model {
  protected $table = 'user_option';
  public $timestamps = false;
}

模型关联从上述代码看,用起来相当便利!

但是当后期,你的系统用户量上去后,不可避免的要用上类似 redis 这样的缓存。假设用户表需要缓存的话,那么结果可能就是另外一种景象了。

class UserCache {
  // 获取用户信息
  public static function findById(int $user_id)
  {
    // 获取缓存数据
    $user = Redis::string('user_' . $user_id);
    if (!empty($user)) {
      return $user;
    }
    $res = UserModel::findById($user_id);
    Redis::string('user_' . $user_id , $res);
    return $res;
  }
}

上述代码缓存了用户的信息到 redis,那如果针对某个用户他的 user 表主体信息没有发生改变,但是 user_option 表发生了改变,那么正常也应该删除该用户的 redis 缓存。

这种情况下,代码的复杂度就直线上升了!

所以,个人建议在代码开发过程中,不要使用模型关联!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
IP138 IP地址查询小偷实现代码
Feb 15 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
Oct 27 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
Jul 08 PHP
Thinkphp无限级分类代码
Nov 11 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
PHP微信开发之有道翻译
Jun 23 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP7多线程搭建教程
Apr 21 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
Apr 09 PHP
Laravel实现短信注册的示例代码
May 29 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 PHP
php获取是星期几的的一些常用姿势
Dec 15 #PHP
Yii2框架中一些折磨人的坑
Dec 15 #PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 #PHP
详解no input file specified 三种解决方法
Nov 29 #PHP
设定php简写功能的方法
Nov 28 #PHP
如何在centos8自定义目录安装php7.3
Nov 28 #PHP
PHP的new static和new self的区别与使用
Nov 27 #PHP
You might like
PHP如何抛出异常处理错误
2011/03/02 PHP
深入解析php之sphinx
2013/05/15 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
php 浮点数比较方法详解
2017/05/05 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
JSON 编辑器实现代码
2009/12/06 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
javascript模拟命名空间
2015/04/17 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
js编写简单的聊天室功能
2017/08/17 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
SVG实现时钟效果
2018/07/17 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
介绍Python的Django框架中的QuerySets
2015/04/20 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
python绘制趋势图的示例
2020/09/17 Python
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
贯彻学习两会心得体会范文
2014/03/17 职场文书
刑事案件上诉状
2015/05/23 职场文书
Golang中异常处理机制详解
2021/06/08 Golang
php去除deprecated的实例方法
2021/11/17 PHP
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
MySQL视图概念以及相关应用
2022/04/19 MySQL