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修正代码
May 09 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
smarty内置函数capture用法分析
Jan 22 PHP
PHP简单的MVC框架实现方法
Dec 01 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 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
用PHP连接Oracle数据库
2006/10/09 PHP
PHP 递归效率分析
2009/11/24 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
python实现进程间通信简单实例
2014/07/23 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
前台文员的岗位职责
2013/11/14 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
亮剑精神观后感
2015/06/05 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
Java实现学生管理系统(IO版)
2022/02/24 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android