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
Nov 25 PHP
深入探讨PHP中的内存管理问题
Aug 31 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
php笔记之:文章中图片处理的使用
Apr 26 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
php给每个段落添加空格的方法
Mar 20 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
PHP邮件群发机实现代码
Feb 16 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
浅谈php调用python文件
Mar 29 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数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
php实现文件预览功能
2017/05/23 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
Vue header组件开发详解
2018/01/26 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
浅谈python对象数据的读写权限
2016/09/12 Python
Python新手们容易犯的几个错误总结
2017/04/01 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
新手学python应该下哪个版本
2020/06/11 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
美的官方商城:Midea
2016/09/14 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
工作中个人的自我评价
2013/12/31 职场文书
文体活动总结范文
2014/05/05 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
民主生活会汇报材料
2014/12/15 职场文书
护理自荐信
2019/05/14 职场文书
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android