一、Db类库巧妙结合连接器、查询器、sql生成器使用在上目录中咔咔使用了query作为案例演示,这个使用在框架中是不建议使用的,因为在维护的方面会有一定的难度。
一、Db类库巧妙结合连接器、查询器、sql生成器使用在上目录中咔咔使用了query作为案例演示,这个使用在框架中是不建议使用的,因为在维护的方面会有一定的难度。 本节案例将会使用框架常用的查询数据库方式进行查询。
在上图中可以看到使用了平时最常用的查询方式,接下来将会对这组案例进行详细分析。 同样代码会来到Db类的 这个方法跟__call方法是有区别的,__call方法是调用不存在的方法会进行调用,一定要注意俩者的区别。
对于上图方法中 所以执行流程会来到 参数就是table中传递的数据库表名
按照上图提供的代码会对传递过来的表名进行三次判断。
根据传递过来的字符串以上三个判断均不成立,于是会执行到下面流程。 在table这个方法中可以看到最后的执行流程就是将传递过来的表名存放在属性
并且最后会将
where方法解析 table方法分析完成后会紧接着执行where方法,同样还是在类
上图中在这个类中可以看到一个方法 这个方法平时都是跟 然后会使用函数 下图第一个结果为 俩组结果返回的值可以进行对比一下,可以更好的理解
紧接着会进行分析查询表达式,也就是方法 在这个方法中需要注意一个点就是关于传递过来的这俩个参数。 参数一为查询逻辑,参数二就是在使用案例时传入的参数。
在代码的第一行就需要我们来学习的一个知识点
关于这个的使用案例在文章 根据学习 在继续学习以下的执行流程,根据咔咔圈出来的框来进行对代码进行简单的解析。
根据上图首先会对查询逻辑的符号全部转为小写 然后在进行判断 最后一个判断就是 所以说代码最终的执行逻辑就是下图圈到的部分。
还记得在案例过程中给where传递的参数就是一个数组。 如果将参数改为 这里咔咔还是使用数组作为参数进行解析,那么代码依然会执行本类的
在这个方法中先需要知道 所以代码会去执行if语句的判断,根据上边的所有判断都不符合所以会执行这段代码 这段代码会判断循环数组的value值是否为数组,如果为数组就是in,反之为=,由于value为1所以数组的第二个值为=。 那么最终where的值就是下图打印的数据。
由于where不为空,代码执行流程会执行到下图位置,最终在返回本类实例。
find()执行流程 接着代码会还是执行本类的find方法,查找单条记录。 由于find中是没有传递参数的,所以代码会执行到 就目前写的案例而言,这段看似很长的代码大家好好看看都可以看明白,最终依然是返回当前的所有参数。
以下就是返回的所以结果
真正的查询数据是这块代码 从这块代码可以看到当查询一条数据时框架默认给加上了limit为1,至于为什么这么加你就需要查看一下sql优化方面的知识了。
在这里就是关于sql语句的生成,代码自己好好看看就会明白,咔咔解析的只是执行流程和具体代码简单的了解一下即可。 至于具体实现流程咔咔在后期如果有机会会单独把每个方法进行深度解析,那时就是主要针对代码的解析。
最终返回结果如下
以上就是关于Db在结合连接器,查询器,生成器实现的数据库查询功能。 截止到这里关于Db的场景就分析到这里,接下来咔咔将会对Model进行简单的分析。 二、关于getLastSql的实现过程还是之前的案例,我们来使用这个方法打印一下结果来看一下是什么。
看到上图就知道是框架最终给生成的SQL语句,那么接下来咔咔就会带大家一起来探讨一下,这个sql语句是如何生成的。 下图为本次演示的案例,也就是咔咔下图圈出来的地方。
从上图圈出来的地方进行代码追踪会到文件 并且返回结果也不去做声明了,上文也提到了,这里只需要知道最终返回结果为
根据上图的返回结果可以知道最终回去调用 根据这个方法可以知道是获取最近一次查询的sql语句。
这里就会有点疑问了,关于属性 关于这种属性的声明一般都会在本类的构造函数或者父类的构造函数中进行声明,这也是在阅读源码时的一个小窍门。 于是我们首先就需要来到本类的构造函数来看一眼。
通过上图可以得知,此处使用了依赖注入的方式,所以 所以说这个
|
