博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
怎么一步步编写简单的PHP的Framework(二十)
阅读量:5867 次
发布时间:2019-06-19

本文共 3339 字,大约阅读时间需要 11 分钟。

hot3.png

        上一次我把SqlParser这个类的主要结构讲了一下,这次我就将这个类的函数编写了。

        按照上节课的内容,主要的函数有下面几个:

        

private function _where($where){}private function _field($field) {}private function _distinct($distinct) {}private function _table($table) {}private function _order($order) {}private function _group($group) {}

        首先我们说一下distinct函数,这个函数最终会返回字符串DISTINCT或者空串,我们可以想一下,这个函数传递的形参实际上是非常简单的,它只需要告诉框架我是否需要DISTINCT即可,所以在框架中只需做一个简单判定就好。

       现假设用户传递的参数为true或字符串'distinct'的时候代表用户想使用'DISTINCT',那么这个函数的实现就变成了这样:

private function _distinct($distinct) {		return ((true === $distinct) || ('distinct' === $distinct)) ? 'DISTANCT' : '';	}
      这里直接使用'distinct' === $distinct判定还是有点问题的,因为用户有时候还是会输入类似'Distinct'这种字符串,如果按照上面的写法,直接就返回空串了,但是用户本来的想法是返回'DISTINCT'。

      其实我们还可以把这个函数再简化一下,在一个SQL中,如果用户需要DISTINCT他才会使用distinct函数,所以我们可以通过判定传递的参数是否为空来判定:

    

private function _distinct($distinct) {     return empty($distinct) ? '' : 'DISTINCT';}

      如果这样这样写,那么还需要在execute方法中判定一下传递的$options中是否有key等于'distinct'的元素,如果有,那么调用_distintct方法的时候就传递一个非空的参数,否则直接传递一个null过来就行。

      说完了简单的distinct,我们再说一下field,它指明要查询的元素,比如:select uid,password from user;

      对这个函数,实际上在调用的时候是有点复杂的,因为可能用户是想所有的都抓取,即返回*,也有可能只返回部分数据,也有可能将某一个字符取别名。

      由于这个函数的形式是:

       

private function _field($field)

      传递的形参有可能是数组,有可能是字符串,也有可能传递一个null,那么我们需要一个个去判定。

      首先是为null的情况,代表的是查找所有的,即返回*。

      然后是字符串,这种的处理很简单,直接返回就好,如$this->field('uid,password'),传递的就是字符串'uid,password',这种实际上不太好。

     然后就是传递数组,首先是array('uid','password')这种方式,这种也需要foreach一下,然后进行字符串拼接即可,元素之间通过,分隔。

     如果传递的是array('uid' => 'test','password' => 'test') 那么解析之后就要变成'uid AS test,password AS test',所以拼接的时候需要传递AS子串。

     好了,分析完了之后,就直接亮代码吧。

     

private function _field($field) {		if(is_array($field)) {			$arr = array();			foreach($field as $key => $val) {				if(is_numeric($key)) {					$arr[] = $val;				} else {					$arr[] = ($key . ' AS ' . $val);				}			}			return implode(',',$arr);		} elseif(is_string($field) && !empty($field)) {			return $field;		} else {			return '*';		}	}
      我们再说一下table,这个函数指定要查询的SQL的表,它传递的可以是字符串,也可以是数组,如果是字符串,我们还是不进行处理,如果是数组,和上面的一样,也有可能有别名的情况,由于思路类似,我就不细讲了,直接贴代码了:

private function _table($table) {		if(is_array($table)) {			$arr = array();			foreach($table as $key => $val) {				if(is_numeric($key)) {					$arr[] = $val;				} else {					$arr[] = ($key . ' AS ' . $val);				}			}			return implode(',',$arr);		} else {			return $table;		}	}
      对于group,实际上很简单,它只是指定了按照哪个元素来分组而已,所以也可以一句话搞定:

 

private function _group($group) {		return empty($group) ? '' : ' GROUP BY ' . $group;	}

     对于order,它只是指定了排序的方式,如果传入的参数为空,那么框架也不处理,如果传递字符串,也不处理,只是将‘ORDER BY’字符串拼接上去即可,如果是数组,那么和上面几个函数一样,也需要判定是否key为数字,因为如果key不为数字也是可能的,比如array('test' => 'asc'),它代表的意思就是按照test递增排序:

private function _order($order) {		if(empty($order)) {			return '';		}		if(is_array($order)) {			$arr = array();			foreach($order as $key => $val) {				if(is_numeric($key)) {					$arr[] = $val;				} else {					$arr[] = ($key . ' ' . $val);				}			}			return ' ORDER BY ' . implode(',',$arr);		}		return ' ORDER BY ' . $order;	}
        

     指定了这些之后,我们在模型中就可以测试一下了,我刚才写的这几个函数就是在一个模型中测试的,使用如下:

distinct()->where()->field(array( 'id' => 'uid','user' ))->table(array( 'user' => 'TEST','limits' ))->group()->order(array( 'test','test2' => 'asc' ))->select(); }}

         这样返回的SQL为:SELECT id AS uid,user FROM user AS TEST,limits WHERE where ORDER BY test,test2 asc,虽然这样的SQL还是错误的,但是距离正确已经不久了。

    由于我一边写这个,一边还要写代码(这些代码都是现场写的),所以消耗的时间比较多,而且也可能会有一些错误,希望大家见谅!!

    今天的代码

转载于:https://my.oschina.net/mingtingling/blog/97687

你可能感兴趣的文章
驰骋工作流引擎表单设计器--表单装载前数据填充
查看>>
微信分享链接或网站文章到微信朋友圈,缩略图片不显示,该如何解决?
查看>>
无屏无外设操作,SSH,VNC
查看>>
企业官网图片与腾讯云服务器映射
查看>>
5分钟制作欢乐捕鱼app
查看>>
git忽略对已入库文件的修改
查看>>
Python gevent学习笔记 2
查看>>
android开机启动service
查看>>
JS-tab切换
查看>>
Json字符串转Map对象
查看>>
获取spring容器中bean的方法
查看>>
学会如何用Karma对你的AngularJS应用进行全测试
查看>>
mybatis三剑客之一 Mybatis-generator-maven-plugin(maven插件)逆向工程生成pojo+dao+mappers...
查看>>
opencv-python保存图像时控制质量以及尺寸
查看>>
my first blog
查看>>
如何使eclipse中subclipse插件变成英文菜单
查看>>
Saltstack 自动化管理基础篇(一)
查看>>
常用js验证代码
查看>>
eclipse地图插件
查看>>
SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署
查看>>