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 a simple smtp class
Nov 26 PHP
隐性调用php程序的方法
Mar 09 PHP
php 文件上传代码(限制jpg文件)
Jan 05 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
PHP四种基本排序算法示例
Apr 09 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
PHP中类与对象功能、用法实例解读
Mar 27 PHP
PHP常用字符串函数用法实例总结
Jun 04 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
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
微信小程序表单弹窗实例
2018/07/19 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
简单介绍Python中的RSS处理
2015/04/13 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
python实现机器人卡牌
2019/10/06 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
学校教研活动总结
2014/07/02 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
客户经理岗位职责
2015/01/31 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
Mysql Online DDL的使用详解
2021/05/20 MySQL