1. 首页
  2. IT资讯

程序员必看之ThinkPHP5中model与Db的区别

“u003Cdivu003Eu003Cpu003Eu003Cstrongu003E在ThinkPHP5的使用过程中,很多使用者刚接触到数据库操作时,不能很好调用相关的方法进行数据库的交互。下面就分享一下ThinkPHP5中Db与模型的区别u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E关于db与model的选择u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E使用DB方式是直接获取到的query类(ThinkPHP5u002Flibraryu002Fthinku002Fdbu002FQuery.php)的对象进行数据库的操作提供了基本的数据库curd操作功能。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fbd7d206d748f410fb13c507762fd094a” img_width=”266″ img_height=”289″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E使用model的方式是通过获取到模型对象然后在调用query类下的方法进行数据操作,但是在TP中的模型基类中还提供了较多的其他的方法可以方便使用例如获取器、修改器、数据完成等等功能。因此模型的功能更为强大u003Cu002Fpu003Eu003Cpu003E就数据格式而言,在DB中是采用的数组格式使用。而在模型中统一使用对象。其中数据库交互后涉及到格式转换。因此在同等情况下db的数据略快与模型方式。u003Cu002Fpu003Eu003Cpu003E因此对于ThinkPHP5使用DB与model的方式具体在编程中选择哪一个按照个人的观点并无强制要求。有时候为了项目中的封装采用模型方式可能更为合适一些u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003EDB数据库的操作u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E关于DB数据库操作具体如何执行下面使用一个操作的案例介绍u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E2.1、创建测试相关代码u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E①创建测试使用的数据表u003Cu002Fpu003Eu003Cpu003ECREATE TABLE `tp_user` (u003Cu002Fpu003Eu003Cpu003E`id` int(11) NOT NULL AUTO_INCREMENT,u003Cu002Fpu003Eu003Cpu003E`name` varchar(255) NOT NULL DEFAULT ”,u003Cu002Fpu003Eu003Cpu003EPRIMARY KEY (`id`)u003Cu002Fpu003Eu003Cpu003E) ENGINE=MyISAM DEFAULT CHARSET=utf8;u003Cu002Fpu003Eu003Cpu003E②写入测试数据u003Cu002Fpu003Eu003Cpu003Einsert into tp_user VALUES(null,’leo’)u003Cu002Fpu003Eu003Cpu003E③配置好数据的连接u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F4750895652ef40108456239127e0fcde” img_width=”753″ img_height=”613″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E④创建一个测试的方法u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F0a31558a7188419e8d37c8028a32c3ba” img_width=”643″ img_height=”392″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E⑤执行的结果u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002Fd10aff040b0242c88fc0e17d1bb44700″ img_width=”563″ img_height=”147″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E2.2、分析index方法中的执行过程u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E由于TP中的自动加载机制Db::name(‘user’)这段代码的执行会自动找到Db类(ThinkPHP55u002Flibraryu002Fthinku002FDb.php)下的静态方法name执行u003Cu002Fpu003Eu003Cpu003E①查看name方法u003Cu002Fpu003Eu003Cpu003E在源码中无法找到有name方法的存在但是找到了一个__callstatic的魔术方法。该魔术方法可以在调用静态方法时自动的触发u003Cu002Fpu003Eu003Cpu003E②查看__callstatic方法u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F80aa466b131e45cda83d31b9d67628ed” img_width=”1055″ img_height=”450″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在该方法中使用call_user_func_array调用了当前类下connect方法并且传递了其他的参数其中$method为要调用的方法名称即name方法u003Cu002Fpu003Eu003Cpu003E③查看connect方法u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F3e513cefa5ba4480a9b3e5e0f9207024″ img_width=”1117″ img_height=”704″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E对于该connect方法的作用就是用于获取对象数据库的操作对象,此处可以打印出得到的对象为think\db\connector\Mysql(ThinkPHP5u002Flibraryu002Fthinku002Fdbu002Fconnectoru002FMysql.php)的对象。即在控制器中所执行的Db::name(‘user’)等价于使用think\db\connector\Mysql调用了name方法u003Cu002Fpu003Eu003Cpu003E④查看think\db\connector\Mysql对象u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F7e9c35ca8b6e48a3851abde54c8e2ea4″ img_width=”890″ img_height=”382″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在该类下并未发现存在name方法以及魔术方法的存在。因此代码能够执行绝对在父类的Connection(ThinkPHP5u002Flibraryu002Fthinku002Fdbu002FConnection.php)中u003Cu002Fpu003Eu003Cpu003E⑤在Connection类中查看name相关的方法u003Cu002Fpu003Eu003Cpu003E在该类下也并未发现存在name方法但是却找到了一个魔术方法__callu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F23f18ba2086d4ed7837a36026e66f765″ img_width=”1005″ img_height=”497″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E结果为u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Febcb0047689045de99b8cd67efc39c4c” img_width=”478″ img_height=”125″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E该魔术方法也是调用了自身类下的getQuery方法u003Cu002Fpu003Eu003Cpu003E⑥查看getQuery的方法u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F1069f3c8407e479e8e21b2a631d1c86d” img_width=”929″ img_height=”394″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E此代码执行最终就获取到了Query类的一个对象。u003Cu002Fpu003Eu003Cpu003E⑦查看query类下name方法u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F1dfa29c2b2b842f798020efc20ada785″ img_width=”889″ img_height=”351″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在name方法后返回了当前对象本身因此最终Db::name(‘user’)得到了一个query类的对象 ,在调用query下的find就找到了数据u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E模型数据库的操作u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E3.1、创建模型相关代码u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E①创建测试方法u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fa00f8fb12ee54d7c93de23a02090e1cc” img_width=”765″ img_height=”532″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E②创建自定义的模型u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Ff2cbd947ef504feba41ea276d17ee41b” img_width=”610″ img_height=”404″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E③执行结果u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fff6f50e1d4fe4141865be3b2c4ae6055″ img_width=”623″ img_height=”481″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E3.2、分析index2方法中的执行过程u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E①model函数的执行u003Cu002Fpu003Eu003Cpu003E在控制器中model(‘User’)函数为ThinkPHP5自带的助手函数可以用于获取到自定义模型类的对象u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fe431a260efac4d72a6a63157489a2e76″ img_width=”1020″ img_height=”476″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E此处是通过的Loader类调用了静态方法所获取到的对象。具体是否为真实的模型对象可以自行打印model(‘User’)所执行的结果u003Cu002Fpu003Eu003Cpu003E②调用get方法u003Cu002Fpu003Eu003Cpu003E由于自定义的模型为空并且继承了TP模型基类因此调用的为模型基类下的get方法u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F75d0df0fbccd4cc88977499ac0c7d9a4″ img_width=”1056″ img_height=”570″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E在源码中通过使用static::parseQuery调用最终得到了query的对象。到这里可以说明模型的数据操作其本质也是调用的query类下的方法所实现u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E关于模型与DB的转换u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E在使用ThinkPHP5的模型操作数据时可能由于各种非模型方法的调用导致直接转换为了query对象此后就不能调用模型方法了往往导致错误无法定位。其实在模型基类中存在__call与__callStatic这两个魔术方法。一旦调用了非模型方法就会自动触发得到一个query对象u003Cu002Fpu003Eu003Cpu003E①修改控制器下的测试代码u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F86a928e68d3249218afd1cc4a2b9b23a” img_width=”740″ img_height=”296″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E②在__Call方法处增加打印u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F1d968a4188284d5696fdf2b26003e730″ img_width=”1039″ img_height=”657″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E③结果u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F8dd9c039226e4dc8a4d68e3b7fc9501c” img_width=”650″ img_height=”147″ alt=”程序员必看之ThinkPHP5中model与Db的区别” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E目前所得到的为query的对象因此后续就不能再调用模型方法了。u003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:程序员必看之ThinkPHP5中model与Db的区别

主题测试文章,只做测试使用。发布者:玩家L-,转转请注明出处:http://www.cxybcw.com/26876.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code