首頁  >  文章  >  php框架  >  ThinkPHP資料庫查詢之模型深度解析

ThinkPHP資料庫查詢之模型深度解析

咔咔
咔咔原創
2021-01-08 10:41:211990瀏覽

在上文聊到了ThinkPHP資料庫查詢Db方式,今天來簡單的聊一下關於Model類別的實現方式。

前言

##Model也就是框架中提到的模型概念,這種使用方式在框架使用上佔了絕大部分。

接下來喀喀爾將會在上文的基礎上再繼續對模型進行深度解析,所以現在準備好小板凳嗑點瓜子來閱讀本文吧!

上文提供給大家的Db類別的執行流程流程圖也給大家放出來,可以在熟悉一下。

ThinkPHP資料庫查詢之模型深度解析Db類別的執行流程

#一、簡單看一眼模型的一些使用檔案

在模組的目錄下肯定是要存在model目錄的

ThinkPHP資料庫查詢之模型深度解析#模型目錄
然後來到框架的底層可以看到關於模型類別的文件,在這個類別中使用了兩個之前咱們學習過的知識點。

第一個就是ArrayAccess像存取陣列一樣存取物件的屬性。

第二個為超類別(trait)這個特性,其實就是實作了一個類似多繼承的一個功能,但是切記PHP是沒有多繼承的,這兩個概念是不能混淆的。

ThinkPHP資料庫查詢之模型深度解析
模型類別框架底層

然後在框架的底層也存在一個model資料夾,這個資料夾中也是使用了跟Db類別一樣的功能。

例如連接器,查詢器,生成器

ThinkPHP資料庫查詢之模型深度解析
模型類別的基礎檔案

經過簡單了解之後我們就需要對模型中的一個案例進行解析了,只是針對一個案例的實作哈!

二、模型場景分析之新增邏輯原始碼解析

#本案例使用模型中的新增作為案例的分析,並且對原始碼進行深度解析。

首先需要先創建出來模型文件,咔咔在創建文件這裡一直都是使用的命令行進行創建的,使用命令行創建文件方式的好處就是防止自己創建文件時對於命名空間會出錯。

ThinkPHP資料庫查詢之模型深度解析
建立模型檔案

然後實作第一個功能使用模型進行新增,這塊的內容真的很簡單,喀喀爾簡單幾步就過了這都是特別基礎的了,咔咔主要工作還是給大家解析實現過程。

控制器中的案例如下,這裡注意一下咔咔的寫法。

ThinkPHP資料庫查詢之模型深度解析
控制器中的案例實作

簡單說一下咔噠為什麼要這麼寫,這樣寫的好處是什麼。

首先是引入模型類別這個是必不可少的。

然後宣告了一個變數

最後一步是在控制器初始化的時候將模型類別賦值給了宣告的變數。

然後使用的時候就使用宣告的那個變數即可,這樣做的好處就是當你的模型名稱後期發生衝突時可以減少修改的程式碼量。

你可以想一下這樣一個場景,你預先定義了一個模型名,然後在後期又想將這個模型名進行改動,這個時候如果按照咔咔的這樣的寫法,你只需要控制器初始化中的內容,也就是一行程式碼搞定。

否則整個程式碼都需要修改,也就是咔咔為什麼要這樣寫。

先來執行一下,看一下執行結果。

ThinkPHP資料庫查詢之模型深度解析
執行結果

根據上圖結果可以得知程式碼邏輯沒有任何問題,接下來將會對save這個方法進行深度解析,看模型跟Db類別的執行方式有什麼不同。

深度解析save方法

首先你要明白這段程式碼會執行到那個檔案裡邊。

ThinkPHP資料庫查詢之模型深度解析
解析這行程式碼會執行那個檔案

都明白這個$this->userModel是模型中的類別的對象,那就直接去這個模型文件裡邊看一眼。

其實這個文件看不看都沒關係,咱們自訂的模型文件一定是繼承的Model文件,也就是在本文一開始咔咔帶大家看的那些關於模型會使用到的文件。

ThinkPHP資料庫查詢之模型深度解析
模型之間的基礎關係

那麼就來到框架底層的模型類別thinkphp/library/think/Model.php

看到這個方法是不是應該明白一點點東西,就是不去看文件也應該一下明白,當save方法只有一個參數的時候就是新增,當存在第二個參數時就是更新。

ThinkPHP資料庫查詢之模型深度解析
儲存目前資料物件

由於喀喀爾的案例中給的參數就是一個數組,所以第一個判斷就不會執行。

接下來將對這個save方法中的寫入之前檢查資料進行深度解析。

接下來看一下這個方法都做了什麼操作。

ThinkPHP資料庫查詢之模型深度解析
寫入先前檢查資料

根據上圖可以得知傳遞過來的參數就是數組,也就是我們需要新增的資料。

在上圖中最重要的一個步驟就是這行程式碼$this->setAttr($key, $value, $data);

根據提示咔咔來到這個方法,三個參數的值也已經印出來,所以判斷都不會執行,只會走最後一步,設定資料物件屬性。

修改器 设置数据对象值
修改器設定資料物件值

根據上圖最終回傳結果會直接回到$this->checkBeforeSave($data, $where) ,也就是下圖。

ThinkPHP資料庫查詢之模型深度解析
寫入之前檢查資料

接下來關於$result = $this->exists ? $this->updateData($ where) : $this->insertData($sequence);這行程式碼就需要該好好理解一下了。

首先可以看到第一個屬性那就是$this->exists,這個值熟悉不,沒錯,就是在寫入之前檢查資料時如果存在where條件則會設定為true,請看下圖

ThinkPHP資料庫查詢之模型深度解析
寫入前檢查資料

所以說程式碼會執行$this->insertData( $sequence)這個方法,在這方法中咱們什麼都不去關注,主要關注是怎麼添加數據的就行了。

也就是關注喀喀爾圈起來的地方即可。

ThinkPHP資料庫查詢之模型深度解析
新增寫入資料

接著程式碼會來到insert這個方法,在這個方法中$this->parseOptions();這裡就是之前分析的分析表達式(可用於查詢或寫入操作)這塊內容。

在這裡就使用了連接器,而這個連接器就是在本類別的建構子透過依賴注入的方式註入進來的物件。

ThinkPHP資料庫查詢之模型深度解析
插入記錄

然後就會來到thinkphp/library/think/db/Connection.php這個檔案的insert方法。

接著會呼叫execute方法進行執行SQL語句,因為在這之前已經將sql語句產生好了,在下文將重新起一個小節深度解析這個方法。

透過builder類別產生SQL語句然後取得綁定的參數 並清空最後使用執行操作,執行sql語句

ThinkPHP資料庫查詢之模型深度解析
插入記錄

三、深度解析execute的執行

案例依然是上節使用的案例

ThinkPHP資料庫查詢之模型深度解析
ThinkPHP資料庫查詢之模型深度解析

#首先得明確一下execute這個方法的參數,在這個方法有三個參數,主要說明第一和第二個參數。

參數的值喀喀已經放到程式碼註解中了。

ThinkPHP資料庫查詢之模型深度解析
明確參數

然後一步一步的分析,首先執行的是$this->initConnect(true);初始化資料庫連線。

在這個方法中需要知道的是,這裡到底判斷的是什麼,其實也就是deploy這個參數是什麼。

ThinkPHP資料庫查詢之模型深度解析
初始化資料庫連線

首先需要明確的是這個參數肯定是從設定檔中取得出來的,然後咱們現在在解析的是資料庫,那麼這個參數有很大的可能就是在資料庫的設定檔。

在對程式碼的分析下我們在資料庫的設定檔中找到了這個設定項,這個設定項是資料庫的部署方式。

0 集中式(單一伺服器),1 分散式(主從伺服器),在本案中,或在真實專案運作中也不會在框架中使用分散式資料庫,所以就不用去了解了。

ThinkPHP資料庫查詢之模型深度解析
資料庫設定檔

然後程式碼就會繼續執行$this->linkID = $this->connect();,也就是註解給的提示為預設單資料庫。

來到這個方法中,咔咔截圖截到的地方會進行資料庫連接ID 支援多個連接的判斷。

然後第二個判斷會直接取得參數配置資訊和本類的建構函式中提前取得的到的資料庫設定文件,並且最後傳回給config屬性。

ThinkPHP資料庫查詢之模型深度解析
連接資料庫方法

接下來解析連接參數這塊的內容,這塊的內容,判斷配置資訊中的params索引值,這個值在設定檔是一個空數組,所以是傳回true的。

第二個判斷是否為數組同樣也會回傳true。

所以說這個判斷條件成立,會執行if的判斷語句。

在這裡說一個小的知識點就是關於運算子與或非的知識。

與:所有的條件都為真回傳true

或:只要有一個條件為真則回傳true

ThinkPHP資料庫查詢之模型深度解析
連線參數

上圖中的本類屬性params已經事先宣告好了,這裡只需要這是pdo連線mysql時需要的參數即可。

PDOThinkPHP資料庫查詢之模型深度解析
PDO連接參數

為了方便大家理解咔咔將這個參數給大家印了出來,請看下圖。

PDOThinkPHP資料庫查詢之模型深度解析
PDO連接參數

也就說關於pdo參數其實就是宣告的一系列常數而已。

接下來就是重中之重了,也就是使用pdo的方式進行連接資料庫,並且將連接資訊回回去,也就是返回給$this->linkID,直到這裡初始化資料庫連線就結束了。

ThinkPHP資料庫查詢之模型深度解析
使用pdo連接資料庫

然後就會使用PDo的操作實例執行execute這個方法是內建的方法,最後返回或影響記錄數。

四、總結

#本節從認識模型所需的檔案然後在對模型的新增行為做了深度的源碼解析行為。

在解析原始碼的過程中有的部分沒有進行完全的講解,但是重點的部分都已經過了一遍。

最後在深度解析了execute這個方法,為什麼要解析這個方法,因為這個方法是所有操作執行的最後一步。

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

以上是ThinkPHP資料庫查詢之模型深度解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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