怎么一步步编写简单的PHP的Framework(二十一)
2019獨角獸企業重金招聘Python工程師標準>>>
? ? ?前幾天我講到在SqlParser中完成SQL的解析,我已經講了distinct,field,table,group,order等的簡單實現,那么怎么實現where呢,沒有where,這個SQL一直還是不能運行的。
? ? ?對于where,我們可以想一下,允許用戶輸入的參數如:
? ? $this->where('uid > 1'),$this->where(array('uid' => array('gt' , 1)))
? ? 這幾種形式,首先第一種,就是直接將這段SQL通過字符串傳遞過來,這種在where函數中只需要拼接一個WHERE子串即可。
? ? ?對于傳遞的參數是數組的情況就比較復雜了,首先,對于最外層的array,它的形式應該是如下的:
? ? ?array(條件,條件,條件....)
? ? ?對于具體的某一個條件,它也是一個數組,如:
? ? ?字段=> array(比較符,數值,連接符)
? ? ?對于最簡單的形式,如$this->where(array('uid' => array('gt',1)))它實際上被解析之后的SQL為:WHERE uid > 1,如果條件為多個:
? ? ?$this->where(array('uid' => array('gt' , 1)),'password' => array('neq' , 'test')),它代表的意思是:WHERE uid > 1 AND password != 'test',我們沒有寫條件與條件之間的連接符,應該框架自己會默認有一個連接符,如AND。
? ? ?由于對于符號:eq,neq,gt,gte等,我們需要將它解析成為如:=,!=,>,>=等,所以我們首先要定義一個函數來處理這個:
? ? ?我們稱這個函數為:_parseCompExp,這個函數的實現為:
?
private function _parseCompExp($exp) {if(is_string($exp)) {return str_replace(array_keys($this->_compExp),array_values($this->_compExp),$exp);}elseif(is_array($exp)) {$tmpArr = array();foreach($exp as $val) {$tmpArr[] = str_replace(array_keys($this->_compExp),array_values($this->_compExp),$val);}return $tmpArr;} else {//不能解析,直接返回return $exp;}}
? 為了擴展,我們不會將需要解析的參數寫死,而是直接做成一個private的變量,如:
? ?具體的where的實現是怎么樣的呢,我剛才寫了一個實現,雖然看著很惡心:
? ? 第一種:>,=,<等,這種后面跟的數值只有一個,如 > 1,這種的解析是比較簡單的,只要通過parseCompExp函數轉換一下,然后字符串拼接即可。
? ? 第二種:IN,IN后面跟的參數個數不一定,所以需要判定后面傳遞的是數組還是字符串,如果是數組,那么需要通過,來explode成為字符串,如果是字符串,那就直接拼接即可。
? ? 第三種,Between,后面跟的參數肯定是兩個, 由于我為了簡單,所以指定了第二個參數為數值,第三個參數為連接符,所以只有在第二個參數中設置數組來解決這個問題,如: 'uid' => array('between',array(2,4))它代表的意思就是:uid between 2 and 4。
? ? 對于其他情況,暫不解析。
? ? 再后面就是判定一下是否需要連接符,如果需要連接符,并且設置了數組的第三個元素,那么直接拼接,否則拼接AND。
? ? 現在我們可以在模型中使用了,使用如下:
<?php class TestModel extends ModelBase {public function test() {$this->distinct()->where()->field(array('id' => 'uid','user'))->table(array('user' => 'TEST','limits'))->group()->order(array('test','test2' => 'asc')) ->where(array('id' => array('gt',1)))->select();} }
? ?當然,這種實現是不完善的,反正先這樣吧!!!
? ?本來一個完整的SQL不只是我們實現的這幾個函數,為了簡便,我就不講后面復雜的內容了。
? ?對于其他框架實現的如:1對多,多對1這種多表查詢,你們可以自己想一下怎么實現。
? ?后面我就粗略講一下DbTable了,DbRelation我就不講了,有興趣去實現的童鞋可以自己試一下。
轉載于:https://my.oschina.net/mingtingling/blog/98233
總結
以上是生活随笔為你收集整理的怎么一步步编写简单的PHP的Framework(二十一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用xml配置文件加载资源时(XML和XM
- 下一篇: 又一个jquery+flash上传插件