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集成FCK的函数代码
Sep 27 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
PHP 魔术函数使用说明
May 14 PHP
PHP操作xml代码
Jun 17 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
Oct 20 PHP
php-redis中的sort排序函数总结
Jul 08 PHP
php实现的递归提成方案实例
Nov 14 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
php时间函数用法分析
May 28 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
yii2 resetful 授权验证详解
May 18 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
php上传、管理照片示例
2006/10/09 PHP
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
优化使用mysql存储session的php代码
2008/01/10 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
JS 表单验证大全
2011/11/23 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
vue 页面跳转的实现方式
2021/01/12 Vue.js
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
Python提取频域特征知识点浅析
2019/03/04 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
关于多元线性回归分析——Python&SPSS
2020/02/24 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
法律专业应届本科毕业生求职信
2013/10/25 职场文书
电脑教师的自我评价
2013/12/18 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python