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 相关文章推荐
用PHP动态生成虚拟现实VRML网页
Oct 09 PHP
php中将时间差转换为字符串提示的实现代码
Aug 08 PHP
php后退一页表单内容保存实现方法
Jun 17 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
php全角字符转换为半角函数
Feb 07 PHP
php获取文件大小的方法
Feb 26 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
php将字符串随机分割成不同长度数组的方法
Jun 01 PHP
深入理解php printf() 输出格式化的字符串
May 23 PHP
laravel使用Faker数据填充的实现方法
Apr 12 PHP
PHP判断函数是否被定义的方法
Jun 21 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
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
Python 正则表达式操作指南
2009/05/04 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
Python实现配置文件备份的方法
2015/07/30 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
python调用自定义函数的实例操作
2019/06/26 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
remote接口和home接口主要作用
2013/05/15 面试题
Servlet面试题库
2015/07/18 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
实习自荐信
2013/10/13 职场文书
家长会演讲稿范文
2014/01/10 职场文书
办护照工作证明范本
2014/01/14 职场文书
个人自我评价和职业目标
2014/01/24 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
2014年学习部工作总结
2014/11/12 职场文书
小学生毕业评语
2014/12/26 职场文书
乐山大佛导游词
2015/02/02 职场文书
投标单位介绍信
2015/05/05 职场文书
房地产项目合作意向书
2015/05/08 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python
Python中22个万用公式的小结
2021/07/21 Python