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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
php mssql扩展SQL查询中文字段名解决方法
Oct 15 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
详解WordPress中简码格式标签编写的基本方法
Dec 22 PHP
Yii2框架自定义类统一处理url操作示例
May 25 PHP
php和html的区别点详细总结
Sep 24 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
一个简单计数器的源代码
2006/10/09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
php验证手机号码
2015/11/11 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
简单实现Python爬取网络图片
2018/04/01 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
JPA的特点
2014/10/25 面试题
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
真诚的求职信
2014/07/04 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL
如何在python中实现ECDSA你知道吗
2021/11/23 Python