从大象装冰箱到模型model的理解

发布于 2019-12-24 17:08:10
这里的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天天改,头发日日疏,码字不易,如果有帮助到你,就点击"下方感谢"支持一下把.

©声明:本站所有文章,如无特殊说明或标注,均为izhnagbo.cn原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。本文链接 https://www.izhangbo.cn/article/31.html
0 条评论

学习
记录

发布
问题