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 相关文章推荐
php5 and xml示例
Nov 22 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
Jul 02 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
php中return的用法实例分析
Feb 28 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
Jan 20 PHP
基于PHP实现的多元线性回归模拟曲线算法
Jan 30 PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 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 chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
smarty自定义函数用法示例
2016/05/20 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
JS backgroundImage控制
2009/05/19 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
Python实现快速排序的方法详解
2019/10/25 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
基于python3实现倒叙字符串
2020/02/18 Python
sklearn+python:线性回归案例
2020/02/24 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
Python 代码调试技巧示例代码
2020/08/11 Python
python logging模块的使用详解
2020/10/23 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
质检部职责
2013/12/28 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
简易离婚协议书范本
2014/10/24 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers