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类Class的概念
Jun 14 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
PHP防盗链代码实例
Aug 27 PHP
php实现字符串首字母大写和单词首字母大写的方法
Mar 14 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
Laravel 中获取上一篇和下一篇数据
Jul 27 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
php中foreach结合curl实现多线程的方法分析
Sep 22 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
Jun 17 PHP
在Laravel中使用DataTables插件的方法
May 29 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 Web木马扫描器代码分享
2015/09/06 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
Node.js readline模块与util模块的使用
2018/03/01 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
Python实现翻转数组功能示例
2018/01/12 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
Pytorch之parameters的使用
2019/12/31 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
公务员培训自我鉴定
2013/09/19 职场文书
校长先进事迹材料
2014/02/01 职场文书
初二学习计划书范文
2014/04/27 职场文书
机关保密承诺书
2014/06/03 职场文书
Opencv中cv2.floodFill算法的使用
2021/06/18 Python