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 printf输出格式使用说明
Dec 05 PHP
解析PHP中的正则表达式以及模式匹配
Jun 19 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
PHP架构及原理知识点详解
Dec 22 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
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
php判断是否为json格式的方法
2014/03/04 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
PHP微商城开源代码实例
2019/03/27 PHP
基于jquery实现瀑布流布局
2020/06/28 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
Python批量转换文件编码格式
2015/05/17 Python
python 实时遍历日志文件
2016/04/12 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
Python中格式化字符串的四种实现
2020/05/26 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
和谐社区口号
2014/06/19 职场文书
英语专业求职信
2014/07/08 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
检讨书怎么写
2015/01/23 职场文书
金砖之国观后感
2015/06/11 职场文书
小爸爸观后感
2015/06/15 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
nginx实现动静分离的方法示例
2021/11/07 Servers
Javascript的promise,async和await的区别详解
2022/03/24 Javascript
Python正则表达式中flags参数的实例详解
2022/04/01 Python
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS