在ThinkPHP5的使用过程中,很多使用者刚接触到数据库操作时,不能很好调用相关的方法进行数据库的交互。下面就分享一下ThinkPHP5中Db与模型的区别

关于db与model的选择

  1. 使用DB方式是直接获取到的query类(ThinkPHP5/library/think/db/Query.php)的对象进行数据库的操作提供了基本的数据库curd操作功能。
  2. 使用model的方式是通过获取到模型对象然后在调用query类下的方法进行数据操作,但是在TP中的模型基类中还提供了较多的其他的方法可以方便使用例如获取器、修改器、数据完成等等功能。因此模型的功能更为强大
  3. 就数据格式而言,在DB中是采用的数组格式使用。而在模型中统一使用对象。其中数据库交互后涉及到格式转换。因此在同等情况下db的数据略快与模型方式。

因此对于ThinkPHP5使用DB与model的方式具体在编程中选择哪一个按照个人的观点并无强制要求。有时候为了项目中的封装采用模型方式可能更为合适一些

DB数据库的操作

关于DB数据库操作具体如何执行下面使用一个操作的案例介绍

2.1、创建测试相关代码

①创建测试使用的数据表

CREATE TABLE `tp_user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL DEFAULT '',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

②写入测试数据

insert into tp_user VALUES(null,'leo')

③配置好数据的连接

④创建一个测试的方法

⑤执行的结果

2.2、分析index方法中的执行过程

由于TP中的自动加载机制Db::name(‘user’)这段代码的执行会自动找到Db类(ThinkPHP55/library/think/Db.php)下的静态方法name执行

①查看name方法

在源码中无法找到有name方法的存在但是找到了一个__callstatic的魔术方法。该魔术方法可以在调用静态方法时自动的触发

②查看__callstatic方法

在该方法中使用call_user_func_array调用了当前类下connect方法并且传递了其他的参数其中$method为要调用的方法名称即name方法

③查看connect方法

对于该connect方法的作用就是用于获取对象数据库的操作对象,此处可以打印出得到的对象为thinkdbconnectorMysql(ThinkPHP5/library/think/db/connector/Mysql.php)的对象。即在控制器中所执行的Db::name(‘user’)等价于使用thinkdbconnectorMysql调用了name方法

④查看thinkdbconnectorMysql对象

在该类下并未发现存在name方法以及魔术方法的存在。因此代码能够执行绝对在父类的Connection(ThinkPHP5/library/think/db/Connection.php)中

⑤在Connection类中查看name相关的方法

在该类下也并未发现存在name方法但是却找到了一个魔术方法__call

结果为

该魔术方法也是调用了自身类下的getQuery方法

⑥查看getQuery的方法

此代码执行最终就获取到了Query类的一个对象。

⑦查看query类下name方法

在name方法后返回了当前对象本身因此最终Db::name(‘user’)得到了一个query类的对象 ,在调用query下的find就找到了数据

模型数据库的操作

3.1、创建模型相关代码

①创建测试方法

②创建自定义的模型

③执行结果

3.2、分析index2方法中的执行过程

①model函数的执行

在控制器中model(‘User’)函数为ThinkPHP5自带的助手函数可以用于获取到自定义模型类的对象

此处是通过的Loader类调用了静态方法所获取到的对象。具体是否为真实的模型对象可以自行打印model(‘User’)所执行的结果

②调用get方法

由于自定义的模型为空并且继承了TP模型基类因此调用的为模型基类下的get方法

在源码中通过使用static::parseQuery调用最终得到了query的对象。到这里可以说明模型的数据操作其本质也是调用的query类下的方法所实现

关于模型与DB的转换

在使用ThinkPHP5的模型操作数据时可能由于各种非模型方法的调用导致直接转换为了query对象此后就不能调用模型方法了往往导致错误无法定位。其实在模型基类中存在__call与__callStatic这两个魔术方法。一旦调用了非模型方法就会自动触发得到一个query对象

①修改控制器下的测试代码

②在__Call方法处增加打印

③结果

目前所得到的为query的对象因此后续就不能再调用模型方法了。

原作者:黑马程序员

原平台:黑马程序员百家号

原链接:黑马程序员:PHP程序员必看之ThinkPHP5中model与Db的区别-百家号

静态方法与非静态方法的区别_程序员必看之ThinkPHP5中model与Db的区别相关推荐

  1. java中的model_Java程序员必看之springmvc中的Model对象在重定向中的数据

    原标题:Java程序员必看之springmvc中的Model对象在重定向中的数据 在springmvc框架中,一个handler方法中的参数可以内置接收Model类型的对象,主要用于存储数据之用,主要 ...

  2. Java程序员必看!java值类型和引用类型的区别

    招聘职位需求套路摘举 以下几个公司的招聘需求:(from lagou) 1.Java开发岗位 职位诱惑: 福利好待遇佳,技术氛围浓,有大牛带成长快. 职位描述: 有赞2021校招官方网申地址(请在官网 ...

  3. ios查看帧率的软件_程序员必看!直播软件开发弱网下保障高清流畅推流的方法...

    通常情况下程序员在开发直播软件时,优化卡顿和延迟是比较多的,只要是优化欠佳,就会导致前端APP运行出问题,为了帮助程序员在开发过程中能更加合理有效的优化,小编在这里从开发的层面简要介绍一下影响直播体验 ...

  4. socket同步和异步通信区别_程序员必知必会,同步通信与异步通信,你了解多少...

    我们常常说,分布式系统需要进行解耦操作,解耦操作最简单的就是把现有的系统拆出几个独立的模块,并把这些模块在不同的机器部署起来.虽然说,分布式系统更加健壮,但往往也引入其他问题,其中,最为麻烦的问题之一 ...

  5. 讲解虚拟服务器的书_程序员不得不看的书

    俗话说:书山有路勤为径,学海无涯苦作舟.面对飞速发展的技术,程序员怎能不看书呢.秉承活到老学到老的信念,给大家推荐一些程序员必看的书籍. 代码整洁之道 英文书名<Clean Code>,作 ...

  6. 程序员必看的书籍推荐

    程序员必看的书籍推荐: 推荐1:Python 网络数据采集 作者:Ryan Mitchell 译者:陶俊杰,陈小莉 原书4.6星好评,一本书搞定数据采集 涵盖数据抓取.数据挖掘和数据分析 提供详细代码 ...

  7. 谈恋爱就是创业?程序员必看的恋爱秘籍,赶紧get起来吧

    谈恋爱就是创业?程序员必看的恋爱秘籍,赶紧get起来吧 我注意到你的时候,你没注意到我 我爱上你的时候,你注意到我 我准备离开的时候,你爱上了我 好险,你喜欢我的时候我还喜欢着你 高中.大学.毕业.工 ...

  8. java书籍_Java程序员必看的 13 本 Java 书籍!

    原文:Java程序员必看的 13 本 Java 书籍! 作者: java技术栈 关乎于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是:多!看!书! 毕竟,书是学习的海洋呢!So,J ...

  9. java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...

最新文章

  1. 3、kubernetes应用快速入门190625
  2. 德信创业系2014版
  3. Windows 10 下 Anaconda3 (Python 3.8) 配置 OpenCV-4.4.0
  4. 三种sqrt函数实现
  5. 后台系统可扩展性学习笔记(五)负载均衡
  6. 算法:合并排序(Merge Sort)
  7. Ubuntu18.04在线安装JDK1.8
  8. 关于推荐系统中的特征工程
  9. Linux常用命令——tac、bc
  10. debian远程桌面设置
  11. rdkit 计算环、芳香环数
  12. 云栖科技评论第56期:莫忧AI泡沫 相信AI兴邦
  13. Linux权限中x是什么意思,linux里的drwxr-xr-x代表的意思
  14. 搜狐公司董事局主席兼首席执行官——张朝阳名言4
  15. 百度Sugar BI 数据可视化里的标签页组件如何实现
  16. Echarts正负条形图将x轴都设置成正数
  17. 中国余热发电市场运作动态与十四五可行性研究报告2021年版
  18. Android2.0 Release 1 Eclair API变化预览
  19. 华为通信基础面试题库以及答案
  20. 《高斯数学日记》——简介

热门文章

  1. 涨姿势 |你所不知道的5 个AR增强现实新趋势
  2. CALayer的基本操作
  3. iOS 成员变量的作用范围
  4. 几种民间排毒养颜祛痘DIY自制面膜 - 健康程序员,至尚生活!
  5. 关于案例教学大家都有些什么看法呢?
  6. linux审计原理,Linux安全审计机制模块实现分析(1)
  7. 华为linux笔记本开售,华为 MateBook D Linux 版明天开售 一种价格两种版本
  8. mysql注释符号按键,Shell 注释
  9. qt5中字符串转字符串数组_Qt中的对象类型转换(Qstring 转换char*有三种方法)
  10. get_live2d获取不到500_有人手机收不到验证码?警方打掉一“薅羊毛”产业链,全国已有570多万台手机被控制……...