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 相关文章推荐
escape unescape的php下的实现方法
Apr 27 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
PHP输入流php://input介绍
Sep 18 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
php过滤敏感词的示例
Mar 31 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
php中文繁体和简体相互转换的方法
Mar 21 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
Mar 26 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
Sep 30 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 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
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
Python处理CSV与List的转换方法
2018/04/19 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
德尔福集团DELPHI的笔试题
2012/02/22 面试题
试用期转正鉴定评语
2014/01/27 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
让生命充满爱观后感
2015/06/08 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
Mysql MVCC机制原理详解
2021/04/20 MySQL
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers
JavaScript 定时器详情
2021/11/11 Javascript
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL