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遍历数组的方法汇总分析
Jun 08 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
PHP中session变量的销毁
Feb 27 PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 PHP
php实现微信发红包
Dec 05 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
Sep 22 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
PHP PDOStatement::fetch讲解
Jan 31 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 PHP
php实现图片压缩处理
Sep 09 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP实时显示输出
2008/10/02 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
关于js类的定义
2011/06/28 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
微信小程序合法域名配置方法
2019/05/06 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
Python实现获取某天是某个月中的第几周
2015/02/11 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
解决python运行启动报错问题
2020/06/01 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
销售心得体会
2014/01/02 职场文书
优良学风班总结材料
2014/02/08 职场文书
《画家乡》教学反思
2014/04/22 职场文书
公务员年度考核评语
2014/12/31 职场文书
会计求职自荐信范文
2015/03/04 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android