淺析ThinkPHP等各種框架裡面SQL操作鍊式寫法原理

韦小宝
發布: 2023-03-20 09:12:01
原創
1892 人瀏覽過

鍊式操作,很多人看起來很神秘,其實你讀完這篇文章後,你就能逐漸的理解鍊式操作。我們深入了ThinkPHP的內核,我們去研究ThinkPHP和其他框架的鍊式操作。只要你會了一種,其他的就一通則百通了。

ThinkPHP,具有非常強大的社區,暴力實用詳細的中文手冊。有一個地方相信大家都不陌生,就是他的鍊式寫法,鍊式寫法的某種程度上簡化了SQL工作量。 OK,是怎麼實現的,那我們從物件導向入手,分析鍊式寫法的實作原理。

如下語句:

$User->limit(10)->where('status=1')->select();
登入後複製
登入後複製

程式碼:

#我們知道,物件導向的方法,可以傳回多種資料類型,當然,也可以回傳物件本身,所以我們可以利用這個特性來實現

<?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());
登入後複製

列印出來的結果:

object(Test)[1]
登入後複製
 private &#39;var&#39; => string &#39;&#39;
登入後複製
(length=0)object(Test)[1]
登入後複製
private &#39;var&#39; => string &#39;Var is change&#39;
登入後複製
 (length=13)
登入後複製

不難發現:我們私有變數$var發生了改變。也就是說,我們$obj->Func(),執行後,回傳了一個帶著$var = "Var is change"的物件。

$User->limit(10)->where(&#39;status=1&#39;)->select();
登入後複製
登入後複製

那麼這個語句就不難理解了。 方法執行後,傳遞物件給下個方法,以此類推。

簡單的Select()實作

<?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}"
                         FROM `{$this->tableName}` 
                         {$this->where} 
                         {$this->order} 
                         {$this->limit}";
             //构造SQL语句模版串
            echo $selectSql;
            //return mysql_query($selectSql);  执行拼接后的SQL语句
        }
    }    
     $user = new UserModel();
     $user->where("`user` = 1")->order("`user` DESC")->limit(5)->select();
?>
登入後複製

總結

思路大概就是透過鍊式運算方法,給SQL語句的各個條件賦值,然後到最後一步統一處理SQL語句。這裡只是簡單地實現下原理,有心的同學可以對方法參數多種類型判斷,更有彈性地賦條件。例如where方法可以傳數組。然後也可以依照此思路,做例如INSERT(),UPDATE(),DELETE()等等。這裡只是拋磚引玉,如果想更深入了解鍊式寫法,也可以看TP源碼。

相關推薦:

基於ThinkPHP底層的DB.php自己改的一個對資料庫的封裝類別

基於ThinkPHP底層的DB.php自己改的一個對資料庫的封裝類,因為學習ThinkPHP框架,不會,就自己去看了看它的資料庫操...

thinkPHP微信分享接口JSSDK實例講解

本文主要和大家介紹thinkPHP微信分享介面JSSDK用法,結合實例形式分析了thinkPHP調...

以上是淺析ThinkPHP等各種框架裡面SQL操作鍊式寫法原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!