傳智播客旗下品牌:|||||

全國咨詢/投訴熱線:400-618-4000

TP5中model與Db的區別【IT運維培訓】

更新時間:2020年06月03日15時40分 來源:傳智播客 瀏覽次數:

在TP5的使用過程中,很多使用者剛接觸到數據庫操作時,不能很好調用相關的方法進行數據庫的交互。下面就分享一下TP5中Db與模型的區別

1、關于db與model的選擇

(1)使用DB方式是直接獲取到的query類(thinkphp/library/think/db/Query.php)的對象進行數據庫的操作提供了基本的數據庫curd操作功能。

(2)使用model的方式是通過獲取到模型對象然后在調用query類下的方法進行數據操作,但是在TP中的模型基類中還提供了較多的其他的方法可以方便使用例如獲取器、修改器、數據完成等等功能。因此模型的功能更為強大

(3)就數據格式而言,在DB中是采用的數組格式使用。而在模型中統一使用對象。其中數據庫交互后涉及到格式轉換。因此在同等情況下db的數據略快與模型方式。

因此對于TP5使用DB與model的方式具體在編程中選擇哪一個按照個人的觀點并無強制要求。有時候為了項目中的封裝采用模型方式可能更為合適一些

2、DB數據庫的操作

關于DB數據庫操作具體如何執行下面使用一個操作的案例介紹

2.1、創建測試相關代碼

①創建測試使用的數據表

CREATE TABLE `tp_user` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `name` varchar(255) NOT NULL DEFAULT '',

    PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

②寫入測試數據

insert into tp_user VALUES(null,'leo')

③配置好數據的連接

model與Db的區別01


④創建一個測試的方法

model與Db的區別02


⑤執行的結果

model與Db的區別04


2.2、分析index方法中的執行過程

由于TP中的自動加載機制Db::name(‘user’)這段代碼的執行會自動找到Db類(thinkphp/library/think/Db.php)下的靜態方法name執行

①查看name方法

在源碼中無法找到有name方法的存在但是找到了一個__callstatic的魔術方法。該魔術方法可以在調用靜態方法時自動的觸發

②查看__callstatic方法

model與Db的區別03


在該方法中使用call_user_func_array調用了當前類下connect方法并且傳遞了其他的參數其中$method為要調用的方法名稱即name方法


③查看connect方法

model與Db的區別04

對于該connect方法的作用就是用于獲取對象數據庫的操作對象,此處可以打印出得到的對象為think\db\connector\Mysql(thinkphp/library/think/db/connector/Mysql。php)的對象。即在控制器中所執行的Db::name(‘user’)等價于使用think\db\connector\Mysql調用了name方法

④查看think\db\connector\Mysql對象

model與Db的區別05


在該類下并未發現存在name方法以及魔術方法的存在。因此代碼能夠執行絕對在父類的Connection(thinkphp/library/think/db/Connection.php)中

⑤在Connection類中查看name相關的方法

在該類下也并未發現存在name方法但是卻找到了一個魔術方法__call

model與Db的區別06


結果為

model與Db的區別07.1

該魔術方法也是調用了自身類下的getQuery方法

⑥查看getQuery的方法

model與Db的區別07


此代碼執行最終就獲取到了Query類的一個對象。

⑦查看query類下name方法

model與Db的區別08


在name方法后返回了當前對象本身因此最終Db::name(‘user’)得到了一個query類的對象 ,在調用query下的find就找到了數據

3、模型數據庫的操作

3。1、創建模型相關代碼

①創建測試方法

model與Db的區別09


②創建自定義的模型

model與Db的區別10


③執行結果

model與Db的區別11

3.2、分析index2方法中的執行過程

①model函數的執行

在控制器中model(‘User’)函數為TP5自帶的助手函數可以用于獲取到自定義模型類的對象

model與Db的區別12

此處是通過的Loader類調用了靜態方法所獲取到的對象。具體是否為真實的模型對象可以自行打印model(‘User’)所執行的結果

②調用get方法

由于自定義的模型為空并且繼承了TP模型基類因此調用的為模型基類下的get方法

model與Db的區別13

在源碼中通過使用static::parseQuery調用最終得到了query的對象。到這里可以說明模型的數據操作其本質也是調用的query類下的方法所實現

4、關于模型與DB的轉換

在使用TP5的模型操作數據時可能由于各種非模型方法的調用導致直接轉換為了query對象此后就不能調用模型方法了往往導致錯誤無法定位。其實在模型基類中存在__call與__callStatic這兩個魔術方法。一旦調用了非模型方法就會自動觸發得到一個query對象

①修改控制器下的測試代碼

model與Db的區別14

②在__Call方法處增加打印

model與Db的區別15

③結果

目前所得到的為query的對象因此后續就不能再調用模型方法了。

model與Db的區別16



猜你喜歡:

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

uids

北京校區

    14天免費試學

    基礎班入門課程限時免費

    申請試學名額

    15天免費試學

    基礎班入門課程限時免費

    申請試學名額

    15天免費試學

    基礎班入門課程限時免費

    申請試學名額

    15天免費試學

    基礎班入門課程限時免費

    申請試學名額

    20天免費試學

    基礎班入門課程限時免費

    申請試學名額

    8天免費試學

    基礎班入門課程限時免費

    申請試學名額

    20天免費試學

    基礎班入門課程限時免費

    申請試學名額

    5天免費試學

    基礎班入門課程限時免費

    申請試學名額

    0天免費試學

    基礎班入門課程限時免費

    申請試學名額

    12天免費試學

    基礎班入門課程限時免費

    申請試學名額

    5天免費試學

    基礎班入門課程限時免費

    申請試學名額

    5天免費試學

    基礎班入門課程限時免費

    申請試學名額

    10天免費試學

    基礎班入門課程限時免費

    申請試學名額
    优优彩票网 河北11选5走势图 网赚彩票真的能赚钱吗 诚信网投开户 秒速赛车官网 乐胜彩票注册开户投注平台 什么网赚最赚现在 新疆11选5走势图 内蒙古快3 内蒙古11选5