thinkphp5 模型关联和缓存简单实践
来源:互联网 发布:linux项目实战简历 编辑:程序博客网 时间:2024/06/06 05:14
参考资料:
掌握ThinkPHP5.0数据库和模型
ThinkPHP5快速入门
ThinkPHP5.0完全开发手册
模型关联
模型关联还是一个非常方便的一个功能,尤其是查询一个数据需要多个表连接的时候,拼接的sql语句很长,让人很头疼,不过tp5的模型关联正好解决了这个问题。
直接上代码
数据库
sell表
country表
其中sell表中的place对应着country表中的id
接着创建sell表的模型SellModel和country表的模型CountryModel,
CountryModel
<?phpnamespace app\home\model;use think\Model;class CountryModel extends Model{ protected $table="country";}
SellModel
<?phpnamespace app\home\model;use think\Model;class SellModel extends Model{ protected $table="sell"; protected $autoWriteTimestamp=true; function country(){ return $this->belongsTo('CountryModel','place','id'); }}
belongsTo(‘关联模型名’,’外键名’,’关联表主键名’,[‘模型别名定义’],’join类型’);
SellModel中有一个关联方法,关联到CountryModel,如果模型不在同一个模块,要添加上命名空间。
还有就是关于hasOne和belongTo的区别在于外键在哪个表中,如果在本表就用belongTo,反之hasOne,
我的外键是place,在本表中,所以用belongTo。
试一下效果
在控制器中
$res=SellModel::all(); foreach ($res as $v){ dump($v->name); dump($v->country->zh_name); }
效果
把sell表中的name和对应到country表中的zh_name查找出来,这么写很方便
但是通过trace调试可以看到,查找的效率并不是很高,尤其是查找数据多的时候,效率更低
每次通过关联方法访问关联表的时候,都会产生一条sql语句
这个时候就要用到关联预载入来提高效率了
$res=SellModel::with('country')->select(); foreach ($res as $v){ dump($v->name); dump($v->country->zh_name); }
打印效果是一样的,再看看执行的sql语句
这个效率就比没用预载入的高多了
还有一个延迟预载入
$res=SellModel::all(); $arr=load_relation($res,'country'); foreach ($arr as $v){ dump($v->name); dump($v->country->zh_name); } }
是当需要关联的时候,用load_relation调用关联方法,load_relation是处理数组,load是处理数据集
最后再用缓存优化一下
//判断是否有这个缓存,就对这个缓存赋值 Cache::remember('sell_list',function (){ return SellModel::with('country')->select(); }); dump(Cache::get('sell_list'));
当然,根据自己的业务逻辑,在有更新和添加操作的时候,缓存也要相应的更新一下。
- thinkphp5 模型关联和缓存简单实践
- thinkphp5 模型关联的bug
- ThinkPHP5-模型和关联操作
- ThinkPHP5学习(12)模型和关联
- thinkphp5的模型中使用关联
- 安全编码实践一:GS编译选项和缓存溢出
- [编程思想]领域模型和缓存应用【一】
- [编程思想]领域模型和缓存应用【二】
- 使用SDWebImage进行简单的图片下载和缓存
- MyBatis关于识别器和缓存的简单理解
- 数据源控件和缓存
- 查询和缓存
- 自定义调节器和缓存
- 过滤器和缓存
- 网络请求和缓存
- <html5>canvas和缓存
- Hibernate查询和缓存
- 计算机内存和缓存
- 0基础lua学习(四)table构造式
- 命令行下选择、复制、粘贴方法
- 教你上传本地代码到github
- java入门篇---java中的数据类型和运算符
- Visual Studio通过配置IP端口来进行局域网调试
- thinkphp5 模型关联和缓存简单实践
- Android检测网络状态,判断当前网络是否可用
- 【机器学习】半监督学习总结
- Asp.net管道模型(管线模型)
- ansroid studio dependencies problem
- Windows Azure Storage
- 卷积神经网络工作原理直观的解释
- 效率类App原型制作分享-One List
- codeforces877C(div2)Slava and tanks(脑洞)