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 相关文章推荐
NOT NULL 和NULL
Jan 15 PHP
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
Feb 15 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
php 3行代码的分页算法(求起始页和结束页)
Oct 21 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
Apr 29 PHP
PHP中array_keys和array_unique函数源码的分析
Feb 26 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
May 02 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
smarty内置函数foreach用法实例
2015/01/22 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
一个实用的php验证码类
2017/07/06 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
js window.open弹出新的网页窗口
2014/01/16 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
js Calender控件使用详解
2015/01/05 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
简单了解Django模板的使用
2017/12/20 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
python操作文件的参数整理
2019/06/11 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
自荐信写法介绍
2014/01/25 职场文书
仓库管理制度范本
2015/08/04 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS