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 4.2书写安全的脚本
Oct 09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
目录,文件操作详谈―PHP
Nov 25 PHP
php快速url重写更新版[需php 5.30以上]
Apr 25 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
php实现的xml操作类
Jan 15 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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
摩卡咖啡
2021/03/03 咖啡文化
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
js选择器全面解析
2016/06/27 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
公司外出活动方案
2014/08/14 职场文书
2015年试用期工作总结
2014/12/12 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL
Hive导入csv文件示例
2022/06/25 数据库