下面由thinkphp框架教程欄目給大家介紹thinkphp框架sql操作鏈?zhǔn)綄?xiě)法原理,希望對(duì)需要的朋友有所幫助!
引言
大家如果有面試幾次不難發(fā)現(xiàn),雖然國(guó)產(chǎn)的TP一直被人詬病。但是絲毫不能影響它在廣大企業(yè)中的開(kāi)發(fā)受到青睞,強(qiáng)大的社區(qū),暴力實(shí)用詳細(xì)的中文手冊(cè)。有一個(gè)地方相信大家都不陌生,就是他的鏈?zhǔn)綄?xiě)法,鏈?zhǔn)綄?xiě)法的一定程度上簡(jiǎn)化了SQL工作量。OK,是怎么實(shí)現(xiàn)的,那我們從面向?qū)ο笕胧郑治鲦準(zhǔn)綄?xiě)法的實(shí)現(xiàn)原理。
如下語(yǔ)句
$User->limit(10)->where('status=1')->select();
代碼
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
我們知道,面向?qū)ο蟮姆椒ǎ梢苑祷囟喾N數(shù)據(jù)類型,當(dāng)然,也可以返回對(duì)象自身,所以我們可以利用這個(gè)特性來(lái)實(shí)現(xiàn)
<?php class Test{ private $var = ""; public function Func(){ $this->var?=?"Var?is?change";???????? return?$this; ????} } ????$obj?=?new?Test(); ????var_dump($obj); ????var_dump($obj->Func());
打印出來(lái)的結(jié)果:
object(Test)[1]?? private?'var'?=>?string?''?(length=0) object(Test)[1]?? private?'var'?=>?string?'Var?is?change'?(length=13)
不難發(fā)現(xiàn):我們私有變量
$User->limit(10)->where('status=1')->select();
那么這個(gè)語(yǔ)句就不難理解了。 方法執(zhí)行后,傳遞對(duì)象給下個(gè)方法,以此類推。
簡(jiǎn)單的Select()實(shí)現(xiàn)
<?php class UserModel{ private $field ="*"; private $tableName =""; private $where =""; private $order =""; private $limit =""; function field($field){ $this->field?=?$field;???????????? ????????return?$this; ????????}???????? ????????function?table($tableName){???????????? ????????$this->table?=?$tableName;???????????? ????????return?$this; ????????}???????? ????????function?order($order){???????????? ????????$this->order?=?"ORDER?BY?".$order;???????????? ????????return?$this; ????????}???????? ????????function?where($where){???????????? ????????$this->where?=?"WHERE?".$where;???????????? ????????return?$this; ????????}???????? ????????function?limit($index,?$limit?=?0){???????????? ????????$this->limit?=?"LIMIT?".$index;???????????? ????????if($limit){???????????????? ????????$this->limit.=?",{$limit}"; ????????????}???????????? ????????????return?$this; ????????}???????? ????????function?select(){???????????? ????????if(empty($this->tableName)){???????????????? ????????$this->tableName?=?str_replace("Model",?"",?__CLASS__);//如果表名不指定,則獲取類名 ????????????} ????????????$selectSql?="SELECT?{$this->field}? ?????????????????????????FROM?`{$this->tableName}`? ?????????????????????????{$this->where}? ?????????????????????????{$this->order}? ?????????????????????????{$this->limit}";? ?????????????????????????//構(gòu)造SQL語(yǔ)句模版串???????????? ?????????????????????????echo?$selectSql;???????????? ?????????????????????????//return?mysql_query($selectSql);??執(zhí)行拼接后的SQL語(yǔ)句 ????????} ????} ????$user?=?new?UserModel(); ????$user->where("`user`?=?1")->order("`user`?DESC")->limit(5)->select();?>
總結(jié)
思路大概就是通過(guò)鏈?zhǔn)讲僮鞣椒ǎoSQL語(yǔ)句的各個(gè)條件賦值,然后到最后一步統(tǒng)一處理SQL語(yǔ)句。這里只是簡(jiǎn)單地實(shí)現(xiàn)下原理,有心的同學(xué)可以對(duì)方法參數(shù)多種類型判斷,更加靈活地賦條件。比如where方法可以傳數(shù)組。然后也可以依照此思路,做例如INSERT(),UPDATE(),DELETE()等等。這里只是拋磚引玉,如果要更加深入了解鏈?zhǔn)綄?xiě)法,也可以看TP源碼。