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和ACCESS写聊天室(十)
Oct 09 PHP
php中用文本文件做数据库的实现方法
Mar 27 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
CI框架常用函数封装实例
Nov 21 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
php 如何设置一个严格控制过期时间的session
May 05 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 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
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
PHP children()函数讲解
2019/02/03 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
vue实现分页栏效果
2019/06/28 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
python新手经常遇到的17个错误分析
2014/07/30 Python
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python 对象中的数据类型
2017/05/13 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
Java里面有没有全局变量?为什么?
2015/02/06 面试题
培训主管的岗位职责
2013/11/23 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
借款民事起诉状范文
2015/05/19 职场文书
英语导游欢迎词
2015/09/30 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
python中的装饰器该如何使用
2021/06/18 Python
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js