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 相关文章推荐
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
PHP array 的加法操作代码
Jul 24 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
php在文件指定行中写入代码的方法
May 23 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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
提升PHP性能的21种方法介绍
2013/06/25 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
ionic3 懒加载
2017/08/16 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
Python运用于数据分析的简单教程
2015/03/27 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
数据库的约束含义
2012/09/09 面试题
个人素质的自我评价分享
2013/12/16 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
医学专业大学生求职信
2014/07/12 职场文书
活动总结范文
2014/08/30 职场文书
简历自荐信范文
2015/03/09 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python