这里的model
只thinkphp5版本中的model,thinkphp6中的think-orm
;
每天都在用模型,但是对模型的底层处理机制一直没有好好的了解过,特别是thinkphp的模型类,一会儿save()一会儿update(),一会儿create()一会儿insert(),还有关联类的使用,云山雾罩的.
再次研究了底层代码后,有了新的理解,总结如下.
首先我们要理清几个核心点.Model
Query
Connection
Mysql
Relation
这几个类所扮演的角色.我们拿一个段子来说明下.
说 把大象装冰箱里 分几步.
我们都听过这个段子,针对这个段子
- Model 就是将大象装入冰箱的一个行动方案,这个方案里规定了把谁(大象)如何(横着/竖着/还是同时放些吃的)放入什么(冰箱)里的整套方案.拥有所有细节/条件/和最终期望的结果.
- Query 就是那个具体落实方案的行动者/执行者,比如这里的将大象放入冰箱的工作人员/科学家/某某残忍的工程师.不论是谁,这个工作就是由他去执行的.
- Mysql 就是冰箱,也就是设备,真正的硬件层面的东西.
- Connection 就是设备调度器,怎么理解呢?你可以放入的是单开门冰箱,也可以是双开门冰箱,甚至是冰窖.这它来通知到底放入什么设备里,当然这里是通知,到底有谁决定放入哪里还是Model/方案说了算.
- Relation 这额嘛,更高级一点的东西.如果我在放大象的同时还要考虑放一些斑马/长颈鹿,Relation提供了这种同时处理的功能.所以在代码里你会发先,Relation不是Model,但它包含有Model对象实例的属性,用来分支处理关联执行的方案.
理解了这些在来看代码,就容易一些了.
Model是方案,拥有以下接口:
- 有关的配置的接口[force(),isAutoWriteTimestamp(),getRelation(),setRelation(),allowField(),isUpdate(),auto(),validate()...],
- 有关数据处理(处理前/处理后)的接口[data(),setAttr(),getAttr(),append(),hidden(),visible(),toArray()...],
- 内部组件的开放接口[getQuery(),db()],
- 如何执行接口[save(),update(),create(),setInc(),saveAll(),delete(),get(),all(),destroy()...],
- 事件接口[event(),beforeInsert(),afterInsert()...]
- 关联处理接口[hasOne(),hasMany(),belongsTo()...]
- __call()引入Query对象实例,使的所有Query的对外接口都可以在Model中使用.比如 $model->where($where)->order()->find();
- __callStatic() 是 __call() 的静态调用处理,使用的所有的Query的对外接口都可以被Model静态调用.比如 Model::where() / Model::Order()
Query是执行者,不论Model怎么配置/处理,它最后都将所有的请求条件变成一条可执行的命令(一条sql语句指令).所有模型查询的链式操作方法基本都是在这里定义的(field,where,order,limit,page,cache,find,select,value,column...)
最后通过 Connection 启动 Mysql 执行sql指令,并将结果返回. Connection 里拥有(execute,query)两个执行方法.
Bug天天改,头发日日疏,码字不易,如果有帮助到你,就点击"下方感谢"支持一下把.