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的网址
Nov 25 PHP
php学习 函数 课件
Jun 15 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
Jun 26 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
PHP curl使用实例
2015/07/02 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
Python help()函数用法详解
2014/03/11 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
Python实现配置文件备份的方法
2015/07/30 Python
浅谈Python的文件类型
2016/05/30 Python
python如何实现代码检查
2019/06/28 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
竞聘副主任科员演讲稿
2014/01/11 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
工商干部先进事迹
2014/05/14 职场文书
岗位工作说明书
2014/07/29 职场文书
争先创优公开承诺书
2014/08/30 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB