ThinkPHP数据库查询之Db类深度解析(3)

简介: ThinkPHP数据库查询之Db类深度解析

三、Db类库巧妙结合连接器、查询器、sql生成器使用

在上目录中咔咔使用了query作为案例演示,这个使用在框架中是不建议使用的,因为在维护的方面会有一定的难度。


本节案例将会使用框架常用的查询数据库方式进行查询。


image.png


在上图中可以看到使用了平时最常用的查询方式,接下来将会对这组案例进行详细分析。


同样代码会来到Db类的__callStatic这个方法,这个方法就是在调用没有声明的静态方法会进行执行的。


这个方法跟__call方法是有区别的,__call方法是调用不存在的方法会进行调用,一定要注意俩者的区别。


image.png


对于上图方法中static::connect()执行最后会返回 object(think\db\Query)这个对象,至于内部流程的执行可以参考第二目录的内容。


所以执行流程会来到thinkphp/library/think/db/Query.php这个类的table方法。


参数就是table中传递的数据库表名tp_test。


image.png


按照上图提供的代码会对传递过来的表名进行三次判断。


  • 第一次判断是否为字符串
  • 第二次判断是否存在 )
  • 第三次判断是否存在 ,

根据传递过来的字符串以上三个判断均不成立,于是会执行到下面流程。


在table这个方法中可以看到最后的执行流程就是将传递过来的表名存放在属性options这个里边。


image.png


并且最后会将think\db\Query Object这个对象进行返回。


image.png


where方法解析


table方法分析完成后会紧接着执行where方法,同样还是在类thinkphp/library/think/db/Query.php


image.png


上图中在这个类中可以看到一个方法func_get_args,这个方法会返回一个包含函数参数列表的数组。


这个方法平时都是跟call_user_func_array同时使用,之前咔咔也使用这俩个方法进行过一次案例实验。


然后会使用函数array_shift删除数组中的第一个元素(red),并返回被删除元素的值。


下图第一个结果为func_get_args这个方法获取出来的数据,第二组结果为array_shift这个方法返回的结果。


俩组结果返回的值可以进行对比一下,可以更好的理解array_shift的使用场景。


image.png


紧接着会进行分析查询表达式,也就是方法parseWhereExp做的事情。


在这个方法中需要注意一个点就是关于传递过来的这俩个参数。


参数一为查询逻辑,参数二就是在使用案例时传入的参数。


image.png


在代码的第一行就需要我们来学习的一个知识点instanceof。


instanceof可以判断某个对象是否是某个类的实例,判断一个对象是否实现了某个接口。


关于这个的使用案例在文章ThinkPHP源码解析之控制器这一文中做了详细的说明。


根据学习instanceof的作用可以清晰的明白第一个判断不会进行执行。


在继续学习以下的执行流程,根据咔咔圈出来的框来进行对代码进行简单的解析。


image.png


根据上图首先会对查询逻辑的符号全部转为小写


然后在进行判断$field instanceof Where传递过来的参数是否为Where类的实例。


最后一个判断就是$field instanceof Expression跟上一步是判断同样的功能。


所以说代码最终的执行逻辑就是下图圈到的部分。


image.png


还记得在案例过程中给where传递的参数就是一个数组。


如果将参数改为where('t_id',1)则就会走is_string($field)的这个流程,这个流程就交给大家了,咔咔就不去解析。


这里咔咔还是使用数组作为参数进行解析,那么代码依然会执行本类的parseArrayWhereItems这个方法


image.png


在这个方法中先需要知道key会返回什么,从当前内部指针位置返回元素键名。


所以代码会去执行if语句的判断,根据上边的所有判断都不符合所以会执行这段代码$where[] = [$key, is_array($val) ? 'IN' : '=', $val];


这段代码会判断循环数组的value值是否为数组,如果为数组就是in,反之为=,由于value为1所以数组的第二个值为=。


那么最终where的值就是下图打印的数据。


image.png


由于where不为空,代码执行流程会执行到下图位置,最终在返回本类实例。


image.png


find()执行流程


接着代码会还是执行本类的find方法,查找单条记录。


由于find中是没有传递参数的,所以代码会执行到$this->parseOptions();分析表达式(可用于查询或者写入操作)


就目前写的案例而言,这段看似很长的代码大家好好看看都可以看明白,最终依然是返回当前的所有参数。



image.png

以下就是返回的所以结果


image.png


真正的查询数据是这块代码$result = $this->connection->find($this);,这段代码会执行到文件thinkphp/library/think/db/Connection.php


从这块代码可以看到当查询一条数据时框架默认给加上了limit为1,至于为什么这么加你就需要查看一下sql优化方面的知识了。

image.png



在这里就是关于sql语句的生成,代码自己好好看看就会明白,咔咔解析的只是执行流程和具体代码简单的了解一下即可。


至于具体实现流程咔咔在后期如果有机会会单独把每个方法进行深度解析,那时就是主要针对代码的解析。


image.png


最终返回结果如下


image.png


以上就是关于Db在结合连接器,查询器,生成器实现的数据库查询功能。


截止到这里关于Db的场景就分析到这里,接下来咔咔将会对Model进行简单的分析。



相关文章
|
人工智能 安全 机器人
无代码革命:10分钟打造企业专属数据库查询AI机器人
随着数字化转型加速,企业对高效智能交互解决方案的需求日益增长。阿里云AppFlow推出的AI助手产品,借助创新网页集成技术,助力企业打造专业数据库查询助手。本文详细介绍通过三步流程将AI助手转化为数据库交互工具的核心优势与操作指南,包括全场景适配、智能渲染引擎及零代码配置等三大技术突破。同时提供Web集成与企业微信集成方案,帮助企业实现便捷部署与安全管理,提升内外部用户体验。
1193 12
无代码革命:10分钟打造企业专属数据库查询AI机器人
|
Cloud Native 关系型数据库 分布式数据库
|
并行计算 关系型数据库 MySQL
如何用 esProc 将数据库表转储提速查询
当数据库查询因数据量大或繁忙变慢时,可借助 esProc 将数据导出为文件进行计算,大幅提升性能。以 MySQL 的 3000 万行订单数据为例,两个典型查询分别耗时 17.69s 和 63.22s。使用 esProc 转储为二进制行存文件 (btx) 或列存文件 (ctx),结合游标过滤与并行计算,性能显著提升。例如,ctx 并行计算将原查询时间缩短至 0.566s,TopN 运算提速达 30 倍。esProc 的简洁语法和高效文件格式,特别适合历史数据的复杂分析场景。
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
数据库
【YashanDB知识库】数据库用户所拥有的权限查询
【YashanDB知识库】数据库用户所拥有的权限查询
|
存储 运维 监控
百万指标,秒级查询,零宕机——时序数据库 TDengine 在 AIOps 中的硬核实战
本篇文章详细讲述了七云团队在运维平台中如何利用 TDengine 解决海量时序数据存储与查询的实际业务需求。内容涵盖了从数据库选型、方案落地到业务挑战及解决办法的完整过程,特别是分享了升级 TDengine 3.x 时的实战经验,给到有需要的小伙伴参考阅读。
831 1
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
959 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1587 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
637 4

热门文章

最新文章

推荐镜像

更多
  • DNS