关于db与model的选择

利用DB办法是直接获取到的query类(ThinkPHP5/library/think/db/Query.php)的工具进行数据库的操作供应了基本的数据库curd操作功能。

利用model的办法是通过获取到模型工具然后在调用query类下的方法进行数据操作,但是在TP中的模型基类中还供应了较多的其他的方法可以方便利用例如获取器、修正器、数据完成等等功能。
因此模型的功能更为强大

dbphp法式员必看之ThinkPHP5中model与Db的差别 React

就数据格式而言,在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方法的浸染便是用于获取工具数据库的操为难刁难象,此处可以打印出得到的工具为think\db\connector\Mysql(ThinkPHP5/library/think/db/connector/Mysql.php)的工具。
即在掌握器中所实行的Db::name(‘user’)等价于利用think\db\connector\Mysql调用了name方法

④查看think\db\connector\Mysql工具

在该类下并未创造存在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的工具因此后续就不能再调用模型方法了。