curd日志记录php,ThinkPHP学习之CURD操作(一)
寫在前面
這周開始學習ThinkPHP,將學習的日記記錄下來。不僅僅學習怎么用TP,也要從源碼上來學習TP框架。
日記每天都寫,但不一定都放到網上。希望自己能夠堅持下去。
閑話少說,既然是閱讀源碼,關于TP的建立,配置等一系列操作就不去說了,官方文檔有佷詳細的介紹。
要同學想要學習TP的可以點擊 ThinkPHP3.2.3快速入門 學習,大家一起進步。
CURD操作
什么是CURD操作?
實際上是對數據庫增刪改查的簡稱。
包括了create、update、read、delete四個基本操作。
在TP中對CURD操作的實現是add,save,select,update。
打開Think/Library/Model.class.php,可以在其中找到這四個操作。
接下來就開始來查看源碼,知道運行的流程,才能夠更好的運用這四個操作。
CUED操作之add方法
add方法用于數據添加,是TP對create操作的實現。
注意一點的是,TPModel中也有create方法,但并不是CURD操作的一種,而是對即將插入數據庫的數據的處理方法。
參數分析
add方法有三個參數(不必須傳遞),如下
$data 默認值'' 需要進行插入數據庫的數據
$option 默認值array() 表達式參數 其中存儲著 所有進行過的連貫操作
$replace 默認值false 是否在插入數據庫時進行replace操作
返回值可能是bool(false)或數據庫受影響的行數或主鍵值。
從返回值看出該操作是必須位于連貫操作的末尾,可以看成一連套組合技中的終結技。
流程分析
我對add方法的執行流程分成了四步
首先,檢測數據是否為空
其次,進行數據處理與表達式分析
以上都通過 進行數據插入 返回插入結果
對返回的結果進行分析
步驟一
假設進行用戶注冊操作,插入數據表User,使用add方法進行操作。
user字段為:
主鍵 user_id
昵稱 user_name
密碼 password
郵箱 email
前臺POST數據:
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傳遞任何參數,但在$User->create($data)中傳遞了該值,在該操作中就會自動將數據添加到Model中的$this->data中,而add會自動引用該值。
同時create方法會將自動將傳遞的參數與數據表的字段進行對比,將不屬于表中的字段刪除。
步驟二
之后,add方法就會調用_facade方法對$data進行數據處理,其實在這里是二次處理$data數據,因為在create方法以及對數據進行過處理。如果在UserController中并沒有調用create方法,而是直接傳遞$data到add方法,那么_facade就會把'confrim' => 'adhe99211' ,'hid' => 'register'刪除,變成:
array(
'user_name' => 'xiamsahfw',
'password' => 'adhe99211' ,
'email' => '221131@qq.com'
);
復制代碼
為了可能的連貫操作,add會調用_parseOptions進行表達式分析。
在表達式分析后即使沒進行任何連貫操作,在返回的值也存在兩個元素:
Array (
[table] => user
[model] => User
)
復制代碼
table表示操作的數據表,model表示操作的模型名。
如果之前存在連貫操作,如where,group by等也會在該項顯示。此外,傳遞連貫操作到add方法,也會和已經存在的操作進行合并。
步驟三
以上其實都是數據插入的準備工作,準備工作完成就能夠進行數據插入了。當然數據插入不屬于Model的功能,在TP中需要調用Think\Driver.class.php中的insert方法。
insert方法接受三個參數
$data
$option
$replace
前兩個參數是處理過的數據以及組合后的連貫操作表達式,第三個參數表示在插入數據庫時,是否進行replace操作,默認為false。在這個方法中會將傳遞的數據與連貫操作表達式進行組合,形成正式的sql語句,并執行sql語句。最后返回執行結果。
步驟四
雖然得到了返回結果,add并不是直接將結果返回,而是返回分析后的結論。insert返回的結果,可能有:
失敗 => false
成功 => 返回受影響的行數
但是實際進行中,我們可能會不僅想要得到一個插入成功的結論,而是想要得到插入后的主鍵值。在add方法中會對返回結果進行判斷,從而返回受影響的行數(多條數據插入)或主鍵值(一條數據)或false。
題外話:
在進行數據插入之前我注意到有這么一行代碼。
if(false === $this->_before_insert($data,$options)) {
return false;
}
復制代碼
這里TP沒有做任何注釋,尋找之后,發現是一個空方法,解釋為 插入數據前的回調方法
// 插入數據前的回調方法
protected function _before_insert(&$data,$options) {}
復制代碼
將這個方法打印出來,結果為NULL
var_dump($this->_before_insert($data,$options)); // NULL
復制代碼
百度一下也沒找到想要的答案,我對TP的官方文檔并沒有看完,可能官方會有用法的介紹。
這里很糾結,我猜測是在子類繼承時,可以實現這個方法進行某些特殊操作(很大可能)。與之相同的還有_after_insert方法。
總結
寫了一大串,也不知道寫的是不是很清晰,但是我的確是對這個方法熟悉了很多。這個方法雖然可以不傳遞參數,但如果之前沒進行create還是會出錯的,雖然內部集成了數據處理,但不是很完善,比如對數據沒能進行轉義,也不能夠對數據字段進行驗證,需要我們自己進行調用其它方法等等。知道了add的運行原理,自然能夠很好的運用它,同時對自己封裝模型類時也有了很大啟發。
今天就寫到這兒,下一篇準備寫CURD中的read,也就是TP中的select。
博主大三狗,正在努力學習中,文中有錯漏之處難免,歡迎指正,歡迎批評。
總結
以上是生活随笔為你收集整理的curd日志记录php,ThinkPHP学习之CURD操作(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql hex2bin_mysqlb
- 下一篇: mysql pkg_Solaris10下