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简单静态页生成过程
Mar 27 PHP
php获取url字符串截取路径的文件名和扩展名的函数
Jan 22 PHP
linux iconv方法的使用
Oct 01 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
php利用curl抓取新浪微博内容示例
Apr 27 PHP
php计算函数执行时间的方法
Mar 20 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
PHP中each与list用法分析
Jan 08 PHP
php获取当前url地址的方法小结
Jan 10 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 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分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
iframe实用操作锦集
2014/04/22 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
Python中http请求方法库汇总
2016/01/06 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
Python3的socket使用方法详解
2020/02/18 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
2014年招商工作总结
2014/11/22 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
楚门的世界观后感
2015/06/03 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android
python在package下继续嵌套一个package
2022/04/14 Python
Redis唯一ID生成器的实现
2022/07/07 Redis