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判断输入不超过mysql的varchar字段的长度范围
Jun 24 PHP
php ajax 静态分页过程形式
Sep 02 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
php实现mysql事务处理的方法
Dec 25 PHP
php上传文件问题汇总
Jan 30 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
PHP-X系列教程之内置函数的使用示例
Oct 16 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 PHP
PHP数组对象与Json转换操作实例分析
Oct 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
记录几个javascript有关的小细节
2007/04/02 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
js实现碰撞检测
2021/01/29 Javascript
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
python3中zip()函数使用详解
2018/06/29 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
在交互式环境中执行Python程序过程详解
2019/07/12 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
大学生就业策划书范文
2014/04/04 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
生态养殖创业计划书
2014/05/06 职场文书
百日安全生产活动总结
2014/07/05 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
计算机专业自荐信
2015/03/05 职场文书