「在上文聊到了ThinkPHP資料庫查詢Db方式,今天來簡單的聊一下關於Model類別的實現方式。
”
第二個為超類別(trait)這個特性,其實就是實作了一個類似多繼承的一個功能,但是切記PHP是沒有多繼承的,這兩個概念是不能混淆的。
然後在框架的底層也存在一個model資料夾,這個資料夾中也是使用了跟Db類別一樣的功能。
例如連接器,查詢器,生成器
經過簡單了解之後我們就需要對模型中的一個案例進行解析了,只是針對一個案例的實作哈!
#本案例使用模型中的新增作為案例的分析,並且對原始碼進行深度解析。
首先需要先創建出來模型文件,咔咔在創建文件這裡一直都是使用的命令行進行創建的,使用命令行創建文件方式的好處就是防止自己創建文件時對於命名空間會出錯。
然後實作第一個功能使用模型進行新增,這塊的內容真的很簡單,喀喀爾簡單幾步就過了這都是特別基礎的了,咔咔主要工作還是給大家解析實現過程。
控制器中的案例如下,這裡注意一下咔咔的寫法。
簡單說一下咔噠為什麼要這麼寫,這樣寫的好處是什麼。
首先是引入模型類別這個是必不可少的。
然後宣告了一個變數
最後一步是在控制器初始化的時候將模型類別賦值給了宣告的變數。
然後使用的時候就使用宣告的那個變數即可,這樣做的好處就是當你的模型名稱後期發生衝突時可以減少修改的程式碼量。
你可以想一下這樣一個場景,你預先定義了一個模型名,然後在後期又想將這個模型名進行改動,這個時候如果按照咔咔的這樣的寫法,你只需要控制器初始化中的內容,也就是一行程式碼搞定。
否則整個程式碼都需要修改,也就是咔咔為什麼要這樣寫。
先來執行一下,看一下執行結果。
根據上圖結果可以得知程式碼邏輯沒有任何問題,接下來將會對save這個方法進行深度解析,看模型跟Db類別的執行方式有什麼不同。
深度解析save方法
首先你要明白這段程式碼會執行到那個檔案裡邊。
都明白這個$this->userModel
是模型中的類別的對象,那就直接去這個模型文件裡邊看一眼。
其實這個文件看不看都沒關係,咱們自訂的模型文件一定是繼承的Model文件,也就是在本文一開始咔咔帶大家看的那些關於模型會使用到的文件。
那麼就來到框架底層的模型類別thinkphp/library/think/Model.php
。
看到這個方法是不是應該明白一點點東西,就是不去看文件也應該一下明白,當save方法只有一個參數的時候就是新增,當存在第二個參數時就是更新。
由於喀喀爾的案例中給的參數就是一個數組,所以第一個判斷就不會執行。
接下來將對這個save方法中的寫入之前檢查資料
進行深度解析。
接下來看一下這個方法都做了什麼操作。
根據上圖可以得知傳遞過來的參數就是數組,也就是我們需要新增的資料。
在上圖中最重要的一個步驟就是這行程式碼$this->setAttr($key, $value, $data);
根據提示咔咔來到這個方法,三個參數的值也已經印出來,所以判斷都不會執行,只會走最後一步,設定資料物件屬性。
根據上圖最終回傳結果會直接回到$this->checkBeforeSave($data, $where)
,也就是下圖。
接下來關於$result = $this->exists ? $this->updateData($ where) : $this->insertData($sequence);
這行程式碼就需要該好好理解一下了。
首先可以看到第一個屬性那就是$this->exists
,這個值熟悉不,沒錯,就是在寫入之前檢查資料時如果存在where條件則會設定為true,請看下圖
所以說程式碼會執行$this->insertData( $sequence)
這個方法,在這方法中咱們什麼都不去關注,主要關注是怎麼添加數據的就行了。
也就是關注喀喀爾圈起來的地方即可。
接著程式碼會來到insert這個方法,在這個方法中$this->parseOptions();
這裡就是之前分析的分析表達式(可用於查詢或寫入操作)
這塊內容。
在這裡就使用了連接器,而這個連接器就是在本類別的建構子透過依賴注入的方式註入進來的物件。
然後就會來到thinkphp/library/think/db/Connection.php
這個檔案的insert
方法。
接著會呼叫execute
方法進行執行SQL語句,因為在這之前已經將sql語句產生好了,在下文將重新起一個小節深度解析這個方法。
透過builder
類別產生SQL語句然後取得綁定的參數 並清空最後使用執行操作,執行sql語句
案例依然是上節使用的案例
#首先得明確一下execute
這個方法的參數,在這個方法有三個參數,主要說明第一和第二個參數。
參數的值喀喀已經放到程式碼註解中了。
然後一步一步的分析,首先執行的是$this->initConnect(true);
初始化資料庫連線。
在這個方法中需要知道的是,這裡到底判斷的是什麼,其實也就是deploy
這個參數是什麼。
首先需要明確的是這個參數肯定是從設定檔中取得出來的,然後咱們現在在解析的是資料庫,那麼這個參數有很大的可能就是在資料庫的設定檔。
在對程式碼的分析下我們在資料庫的設定檔中找到了這個設定項,這個設定項是資料庫的部署方式。
0 集中式(單一伺服器),1 分散式(主從伺服器),在本案中,或在真實專案運作中也不會在框架中使用分散式資料庫,所以就不用去了解了。
然後程式碼就會繼續執行$this->linkID = $this->connect();
,也就是註解給的提示為預設單資料庫。
來到這個方法中,咔咔截圖截到的地方會進行資料庫連接ID 支援多個連接的判斷。
然後第二個判斷會直接取得參數配置資訊和本類的建構函式中提前取得的到的資料庫設定文件,並且最後傳回給config屬性。
接下來解析連接參數這塊的內容,這塊的內容,判斷配置資訊中的params索引值,這個值在設定檔是一個空數組,所以是傳回true的。
第二個判斷是否為數組同樣也會回傳true。
所以說這個判斷條件成立,會執行if的判斷語句。
在這裡說一個小的知識點就是關於運算子與或非
的知識。
與:所有的條件都為真回傳true
或:只要有一個條件為真則回傳true
上圖中的本類屬性params
已經事先宣告好了,這裡只需要這是pdo連線mysql時需要的參數即可。
為了方便大家理解咔咔將這個參數給大家印了出來,請看下圖。
也就說關於pdo參數其實就是宣告的一系列常數而已。
接下來就是重中之重了,也就是使用pdo的方式進行連接資料庫,並且將連接資訊回回去,也就是返回給$this->linkID
,直到這裡初始化資料庫連線就結束了。
然後就會使用PDo的操作實例執行execute
這個方法是內建的方法,最後返回或影響記錄數。
#本節從認識模型所需的檔案然後在對模型的新增行為做了深度的源碼解析行為。
在解析原始碼的過程中有的部分沒有進行完全的講解,但是重點的部分都已經過了一遍。
最後在深度解析了execute
這個方法,為什麼要解析這個方法,因為這個方法是所有操作執行的最後一步。
「堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。
”
以上是ThinkPHP資料庫查詢之模型深度解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!