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(1)
Oct 09 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
May 16 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
PHP多文件上传类实例
Mar 07 PHP
php短网址和数字之间相互转换的方法
Mar 13 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
Jul 10 PHP
php获取是星期几的的一些常用姿势
Dec 15 #PHP
Yii2框架中一些折磨人的坑
Dec 15 #PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 #PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 #PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 #PHP
laravel通用化的CURD的实现
Dec 13 #PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 #PHP
You might like
列表内容的选择
2006/06/30 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
jquery动态添加option示例
2013/12/30 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
jQuery实现可编辑的表格
2019/12/11 jQuery
用js编写留言板
2020/03/17 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
python使用KNN算法手写体识别
2018/02/01 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
python实现雨滴下落到地面效果
2018/06/21 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
大学生应聘推荐信范文
2013/11/19 职场文书
上班睡觉检讨书
2014/01/09 职场文书
红旗方阵解说词
2014/02/12 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
Java面试题冲刺第十九天--数据库(4)
2021/08/07 Java/Android
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
JavaScript获取URL参数的方法分享
2022/04/07 Javascript