首頁 >php框架 >ThinkPHP >ThinkPHP資料庫查詢之Db類場景分析

ThinkPHP資料庫查詢之Db類場景分析

咔咔
咔咔原創
2021-01-11 12:08:251835瀏覽

終於快來到框架解析的結尾了,本文將會帶領大家領略框架​​中的模型以及視圖的奧秘。

前言

#在日常開發過程中模型的使用是非常之多的,但是在開發過程只知道如何使用,並不知道內在是如何實現的,模型是不管介面還是後台都會使用到的東西。

關於視圖在前後台分離的大趨勢下,框架存在視圖大多數還是針對於後台開發的使用。

本文也是對框架解讀快到最後階段了,接下來喀喀將帶領大家一起學習關於在框架中Db類別的奧秘。

下圖為喀喀爾提供的腦圖可以根據這個腦圖來閱讀文章。

ThinkPHP資料庫查詢之Db類場景分析
資料庫執行流程

一、Db操作類別和其它類別對應關係解刨

#在學習模型之前一定要知道的就是DB這個類,這個類別也是對資料庫的操作。

在框架中存在這樣一個設定文件,在這個設定檔裡邊會存在關於資料庫配置的一系列資訊。

在接下來的過程中咔咔也會簡單的建立一個資料庫來做示範。

ThinkPHP資料庫查詢之Db類場景分析
資料庫設定檔

同樣在框架的核心層存在兩個類,分別為Db類和Model類,這兩個類就是接下來的解析對象。

ThinkPHP資料庫查詢之Db類場景分析
框架核心層需要知道的兩個類別

在解析Db操作類別和其它類別對應關係解刨之前,我們先建立一個資料庫作為演示使用。

ThinkPHP資料庫查詢之Db類場景分析
示範資料庫

先來看看Db類別的資訊。

ThinkPHP資料庫查詢之Db類場景分析
類別的註解

透過上圖我們可以看到關於Db類別的一部分信息,就是使用Db類別的一些查詢方法。

但來到Db類別的最後可以看到一個熟悉的方法__callStatic

ThinkPHP資料庫查詢之Db類場景分析
呼叫沒有宣告的靜態方法

這個方法在一直讀喀喀文章的讀者應該已經很是熟悉了,這個方法在門面原始碼解析那一節中進行過深入的了解。

對於這個方法只需要記住的是在呼叫沒有宣告的靜態方法時會進行呼叫。

至於call_user_func_array這個函數的使用可以理解為,這個方法是內建函數,可以直接呼叫函數運行,也就是可以直接運行方法。

ThinkPHP資料庫查詢之Db類場景分析
門面類別的原始碼

在透過剛剛的檢視Db類別的註解資訊時可以看到Db類別是使用著Connection這個類,也就是連接資料庫類別。

ThinkPHP資料庫查詢之Db類場景分析
連接資料庫類別

進入到這個類別裡邊簡單的看一下建構函式即可,至於是怎麼一個運作順序會在下文進行講解。

ThinkPHP資料庫查詢之Db類場景分析
資料庫配置陣列建立Builder物件

在框架中操作控制器有兩個大場景,第一中為Db類別操作,第二種就是Model操作。

其中Connection·為連接器,Query為查詢器,Builder為sql產生器,exception為異常類別。

知道了以上的幾個訊息,在接下來的理解過程中會有一定的幫助,在下一節中將會對Db類別庫場景分析。

二、Db類別庫場景分析

#先從一個簡單的案例解析,先來看看資料庫的數據。

ThinkPHP資料庫查詢之Db類場景分析
資料庫模擬資料

然後來到控制器寫一個簡單的查詢案例,在建立控制器之前先使用指令進行建立一個測試控制器。

ThinkPHP資料庫查詢之Db類場景分析
所建立的測試控制器

在這個控制器進行簡單的查詢資料。

ThinkPHP資料庫查詢之Db類場景分析
使用簡單的案例進行查詢資料庫資料

查詢結果如下

ThinkPHP資料庫查詢之Db類場景分析
查詢結果

##在這個案例中,可以看到使用的是Db::query

這種查詢方式,接下來對於這種查詢方式進行簡單的剖析。

接著執行流程就會來到Db這個類,在這個類別中可以看到關於當物件存取不存在的靜態方法時,__callStatic()方法會被自動呼叫。

這個方法在先前門面的講解中進行了深度講解。
ThinkPHP資料庫查詢之Db類場景分析
Db類別中的靜態呼叫方法

從上圖可以看到執行存取物件不存在的靜態方法時會執行到 call_user_func_array呼叫回呼函數,並把一個陣列參數當作回呼函數的參數

接著程式碼就會執行到static::connect()

這行程式碼,由於本類Db沒有繼承任何的類,所以對於static這個的使用就是呼叫本類。

如果當Db類別繼承了其它類別那麼就會有一定的區別,這個區別就是關於static關鍵字,給大家做的一點點冷門知識得補充,當一個類別繼承一個類別時,在父類別實用static關鍵字時,預設呼叫的子類別的方法。 ###

切換資料庫連線

因為沒有任何繼承,所以會來到本類別的connect這個方法。

在這個類別裡邊首先會回傳結果為資料庫配置資訊。

然後會從組態資訊取得到query這個索引,最後回傳\think\db\Query這個字串,這裡一定要注意回傳的是字符串,不是這個類別的實例。

緊接著就會執行到第三步驟建立資料庫連線物件實例,接著裡將會對這一步驟進行解析。

ThinkPHP資料庫查詢之Db類場景分析
切換資料庫連線

緊接著會來到檔案實際執行的為new \think\db\Query,最終會傳回執行查詢傳回資料集,回傳資料為傳回object(think\db\Query)

#關於這個$this->connection是在本類的構造函數進行設定的。

ThinkPHP資料庫查詢之Db類場景分析
執行查詢傳回資料集

先簡單的看一下這個建構函數,在這個建構函式中直接就設定了connection這個屬性的值,所以在上圖可以使用。

ThinkPHP資料庫查詢之Db類場景分析
設定連接

在這裡執行完成之後就會將傳回的值給從一開始就解析的這個呼叫未宣告的靜態方法會進行呼叫。

其中static::connect()就是最終回傳的值static::connect() 回傳 object(think\db\Query)

ThinkPHP資料庫查詢之Db類場景分析
靜態方法呼叫

所以接下來程式碼會執行到 thinkphp/library/think/db/Query.php 的query方法

#$sql 是Db::query()中傳遞的sql語句,並且執行查詢回傳資料集

最後這段程式碼會執行think\db\connector\Mysql的query方法

ThinkPHP資料庫查詢之Db類場景分析
執行查詢回傳資料集

接下來來到think\db\connector\Mysql的query方法

在這個方法中主要做了三件事情。

  • $this->initConnect 初始化資料庫連線
  • $this->PDOStatement->execute( ); 執行查詢
  • return $this->getResult($pdo, $procedure); 傳回結果集
ThinkPHP資料庫查詢之Db類場景分析
執行查詢返回資料集

解析$this->initConnect 初始化資料庫連接

在這個方法中可以看到是進行了一次配置資訊獲取,首先需要明白這個配置資訊是什麼。

ThinkPHP資料庫查詢之Db類場景分析
初始化資料庫連線

這個設定項是在設定檔database中設定的,根據註解提供的資訊可以看到主要是關於主從伺服器設定的。

一般情況下是不會在框架中配置主從資訊的,這裡就不去解析框架是如何實作資料庫的主從配置了。

ThinkPHP資料庫查詢之Db類場景分析
資料庫部署方式:0 集中式(單一伺服器),1 分散式(主從伺服器)

在這個判斷中在進行了一次判斷目前資料庫連接的id,然後執行了連接資料庫方法。

這個方法最終會回傳object(PDO)#33的一個實例資訊。

ThinkPHP資料庫查詢之Db類場景分析
連接資料庫方法

$this->PDOStatement->execute(); 執行查詢

#第二件事做的就是執行查詢,接下來我們來詳細說明這個到底是如何執行的。

ThinkPHP資料庫查詢之Db類場景分析
執行查詢

在傳回pdo實例時,將這個實例賦值給了$this->PDOStatement這個屬性,所以會去PDO類別中執行。

在這裡大家需要明白一件事情就是關於execute這個方法,用來執行傳回多個結果集、多個更新計數或二者組合的語句。

第三件事情傳回結果集

直到這裡就是執行的最後一步就是傳回結果集。

這裡使用的方法都是查詢底層,就在去解析了,在這裡就會回傳最終查詢結果。

ThinkPHP資料庫查詢之Db類場景分析
取得資料集陣列

最終結果就會回傳至這裡__callStatic方法,並且傳回給上層的$ res變數。

ThinkPHP資料庫查詢之Db類場景分析
測試案例
ThinkPHP資料庫查詢之Db類場景分析
最終查詢結果

直到這裡關於使用Db查詢的執行流程就解析完了, 但是框架給封裝的方法不僅僅只有query,其它的查詢方式可以按照咔咔的這個流程在進行簡單的分析。

最後執行的都會是這一節的最後幾個流程,只是前邊執行會有一點點區別而已。

堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。

以上是ThinkPHP資料庫查詢之Db類場景分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn