ThinkPHP學(xué)習(xí)之CURD操作(一)

寫在前面

這周開始學(xué)習(xí)ThinkPHP,將學(xué)習(xí)的日記記錄下來。不僅僅學(xué)習(xí)怎么用TP,也要從源碼上來學(xué)習(xí)TP框架。

日記每天都寫,但不一定都放到網(wǎng)上。希望自己能夠堅持下去。

閑話少說,既然是閱讀源碼,關(guān)于TP的建立,配置等一系列操作就不去說了,官方文檔有佷詳細(xì)的介紹。

要同學(xué)想要學(xué)習(xí)TP的可以點擊 ThinkPHP3.2.3快速入門 學(xué)習(xí),大家一起進(jìn)步。

CURD操作

什么是CURD操作?
實際上是對數(shù)據(jù)庫增刪改查的簡稱。
包括了create、update、read、delete四個基本操作。
在TP中對CURD操作的實現(xiàn)是add,save,selectupdate。

打開Think/Library/Model.class.php,可以在其中找到這四個操作。
接下來就開始來查看源碼,知道運行的流程,才能夠更好的運用這四個操作。

CUED操作之a(chǎn)dd方法

add方法用于數(shù)據(jù)添加,是TP對create操作的實現(xiàn)。
注意一點的是,TPModel中也有create方法,但并不是CURD操作的一種,而是對即將插入數(shù)據(jù)庫的數(shù)據(jù)的處理方法。

參數(shù)分析

add方法有三個參數(shù)(不必須傳遞),如下

$data 默認(rèn)值'' 需要進(jìn)行插入數(shù)據(jù)庫的數(shù)據(jù)
$option 默認(rèn)值array() 表達(dá)式參數(shù) 其中存儲著 所有進(jìn)行過的連貫操作
$replace 默認(rèn)值false 是否在插入數(shù)據(jù)庫時進(jìn)行replace操作

返回值可能是bool(false)或數(shù)據(jù)庫受影響的行數(shù)或主鍵值。
從返回值看出該操作是必須位于連貫操作的末尾,可以看成一連套組合技中的終結(jié)技。

流程分析

我對add方法的執(zhí)行流程分成了四步

  • 首先,檢測數(shù)據(jù)是否為空
  • 其次,進(jìn)行數(shù)據(jù)處理與表達(dá)式分析
  • 以上都通過 進(jìn)行數(shù)據(jù)插入 返回插入結(jié)果
  • 對返回的結(jié)果進(jìn)行分析

步驟一
假設(shè)進(jìn)行用戶注冊操作,插入數(shù)據(jù)表User,使用add方法進(jìn)行操作。
user字段為:

主鍵 user_id
昵稱 user_name
密碼 password
郵箱 email

前臺POST數(shù)據(jù):

array(
    'user_name'     => 'xiamsahfw',
    'password'      => 'adhe99211' ,
    'confrim'       => 'adhe99211' ,
    'email'         => '221131@qq.com',
    'hid'           => 'register'              
); 

UserController類中的操作:

$data = I('post.');
$User = M('User');
$User->create($data);
$User->add();

add操作中,并沒有給add傳遞任何參數(shù),但在$User->create($data)中傳遞了該值,在該操作中就會自動將數(shù)據(jù)添加到Model中的$this->data中,而add會自動引用該值。

同時create方法會將自動將傳遞的參數(shù)與數(shù)據(jù)表的字段進(jìn)行對比,將不屬于表中的字段刪除。

步驟二
之后,add方法就會調(diào)用_facade方法對$data進(jìn)行數(shù)據(jù)處理,其實在這里是二次處理$data數(shù)據(jù),因為在create方法以及對數(shù)據(jù)進(jìn)行過處理。如果在UserController中并沒有調(diào)用create方法,而是直接傳遞$dataadd方法,那么_facade就會把'confrim' => 'adhe99211' ,'hid' => 'register'刪除,變成:

array(
     'user_name'     => 'xiamsahfw',
     'password'      => 'adhe99211' ,
     'email'         => '221131@qq.com'            
    );

為了可能的連貫操作,add會調(diào)用_parseOptions進(jìn)行表達(dá)式分析。
在表達(dá)式分析后即使沒進(jìn)行任何連貫操作,在返回的值也存在兩個元素:

Array (
[table] => user
[model] => User
)

table表示操作的數(shù)據(jù)表,model表示操作的模型名。

如果之前存在連貫操作,如wheregroup by等也會在該項顯示。此外,傳遞連貫操作到add方法,也會和已經(jīng)存在的操作進(jìn)行合并。

步驟三
以上其實都是數(shù)據(jù)插入的準(zhǔn)備工作,準(zhǔn)備工作完成就能夠進(jìn)行數(shù)據(jù)插入了。當(dāng)然數(shù)據(jù)插入不屬于Model的功能,在TP中需要調(diào)用Think\Driver.class.php中的insert方法。

insert方法接受三個參數(shù)

$data
$option
$replace

前兩個參數(shù)是處理過的數(shù)據(jù)以及組合后的連貫操作表達(dá)式,第三個參數(shù)表示在插入數(shù)據(jù)庫時,是否進(jìn)行replace操作,默認(rèn)為false。在這個方法中會將傳遞的數(shù)據(jù)與連貫操作表達(dá)式進(jìn)行組合,形成正式的sql語句,并執(zhí)行sql語句。最后返回執(zhí)行結(jié)果。

步驟四
雖然得到了返回結(jié)果,add并不是直接將結(jié)果返回,而是返回分析后的結(jié)論。insert返回的結(jié)果,可能有:

失敗 => false
成功 => 返回受影響的行數(shù)

但是實際進(jìn)行中,我們可能會不僅想要得到一個插入成功的結(jié)論,而是想要得到插入后的主鍵值。在add方法中會對返回結(jié)果進(jìn)行判斷,從而返回受影響的行數(shù)(多條數(shù)據(jù)插入)或主鍵值(一條數(shù)據(jù))或false。

題外話:
在進(jìn)行數(shù)據(jù)插入之前我注意到有這么一行代碼。

if(false === $this->_before_insert($data,$options)) {
    return false;
}

這里TP沒有做任何注釋,尋找之后,發(fā)現(xiàn)是一個空方法,解釋為 插入數(shù)據(jù)前的回調(diào)方法

// 插入數(shù)據(jù)前的回調(diào)方法
protected function _before_insert(&$data,$options) {}

將這個方法打印出來,結(jié)果為NULL

var_dump($this->_before_insert($data,$options));  // NULL

百度一下也沒找到想要的答案,我對TP的官方文檔并沒有看完,可能官方會有用法的介紹。
這里很糾結(jié),我猜測是在子類繼承時,可以實現(xiàn)這個方法進(jìn)行某些特殊操作(很大可能)。與之相同的還有_after_insert方法。

總結(jié)

寫了一大串,也不知道寫的是不是很清晰,但是我的確是對這個方法熟悉了很多。這個方法雖然可以不傳遞參數(shù),但如果之前沒進(jìn)行create還是會出錯的,雖然內(nèi)部集成了數(shù)據(jù)處理,但不是很完善,比如對數(shù)據(jù)沒能進(jìn)行轉(zhuǎn)義,也不能夠?qū)?shù)據(jù)字段進(jìn)行驗證,需要我們自己進(jìn)行調(diào)用其它方法等等。知道了add的運行原理,自然能夠很好的運用它,同時對自己封裝模型類時也有了很大啟發(fā)。

今天就寫到這兒,下一篇準(zhǔn)備寫CURD中的read,也就是TP中的select

博主大三狗,正在努力學(xué)習(xí)中,文中有錯漏之處難免,歡迎指正,歡迎批評。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上一節(jié)寫了關(guān)于TP的一些概念,這一節(jié)主要記錄對數(shù)據(jù)庫的CURD操作。看完官方文檔頓時感覺TP對數(shù)據(jù)操作API的封裝...
    遠(yuǎn)方的楓葉閱讀 2,546評論 1 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,805評論 18 399
  • 我坐在床邊, 望著半開的百葉窗, 從它的縫隙中我看見藍(lán)色的天, 像是在海邊, 飄著白色的波線,閃得刺眼。
    My彩虹閱讀 243評論 2 3
  • 每一段都是一種體會,每個腳印都值得紀(jì)念。有時候很很多別人不能理解的決定也就這么隨心走了。
    GalsangZhuo閱讀 198評論 0 0

友情鏈接更多精彩內(nèi)容