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