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 相关文章推荐
使用eAccelerator加密PHP程序
Oct 03 PHP
PHP 多维数组排序实现代码
Aug 05 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
May 06 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
php递归函数中使用return的注意事项
Jan 17 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
Codeigniter校验ip地址的方法
Mar 21 PHP
php的常量和变量实例详解
Jun 27 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
PHP钩子实现方法解析
May 21 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
Oct 09 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
浅谈python之新式类
2018/08/12 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Python语言快速上手学习方法
2018/12/14 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
python安装pil库方法及代码
2019/06/25 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
旅游项目开发策划书
2014/01/18 职场文书
护士进修自我鉴定
2014/02/07 职场文书
医院信息公开实施方案
2014/05/09 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
商场收银员岗位职责
2015/04/07 职场文书
政府会议通知范文
2015/04/15 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
Python基础学习之奇异的GUI对话框
2021/05/27 Python
Kubernetes控制节点的部署
2022/04/01 Servers
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS