ThinkPHP3.1數(shù)據(jù)CURD操作快速入門(mén)
1.CURD概述:
CURD是一個(gè)數(shù)據(jù)庫(kù)技術(shù)中的縮寫(xiě)詞,一般的項(xiàng)目開(kāi)發(fā)的各種參數(shù)的基本功能都是CURD。它代表創(chuàng)建(Create)、更新(Update)、讀取(Read)和刪除(Delete)操作。CURD 定義了用于處理數(shù)據(jù)的基本原子操作。之所以將CURD提升到一個(gè)技術(shù)難題的高度是因?yàn)橥瓿梢粋€(gè)涉及在多個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中進(jìn)行CURD操作的匯總相關(guān)的活動(dòng),其性能可能會(huì)隨數(shù)據(jù)關(guān)系的變化而有非常大的差異。
CURD在具體的應(yīng)用中并非一定使用create、update、read和delete字樣的方法,但是他們完成的功能是一致的。例如,ThinkPHP就是使用add、save、select和delete方法表示模型的CURD操作。
2.創(chuàng)建數(shù)據(jù)
大多數(shù)情況下,CURD的Create操作通常會(huì)通過(guò)表單來(lái)提交數(shù)據(jù),首先,我們?cè)陧?xiàng)目的Tpl/Form目錄下面創(chuàng)建一個(gè)add.html 模板文件,內(nèi)容為:
<FORM method="post" action="__URL__/insert"> 標(biāo)題:<INPUT type="text" name="title"><br/> 內(nèi)容:<TEXTAREA name="content" rows="5" cols="45"></TEXTAREA><br/> <INPUT type="submit" value="提交"> </FORM>
然后,我們還需要在項(xiàng)目的Action目錄下面創(chuàng)建一個(gè)FormAction.class.php文件,暫時(shí)只需要定義FormAction類(lèi),不需要添加任何操作方法,代碼如下:
class FormAction extends Action{ }
接下來(lái),訪問(wèn):
http://localhost/app/index.php/Form/add
就可以看到表單頁(yè)面了,我們并沒(méi)有在控制器里面定義add操作方法,但是很顯然,訪問(wèn)是正常的。因?yàn)門(mén)hinkPHP在沒(méi)有找到對(duì)應(yīng)操作方法的情況下,會(huì)檢查是否存在對(duì)應(yīng)的模板文件,由于我們有對(duì)應(yīng)的add模板文件,所以控制器就直接渲染該模板文件輸出了。所以說(shuō)對(duì)于沒(méi)有任何實(shí)際邏輯的操作方法,我們只需要直接定義對(duì)應(yīng)的模板文件就行了。
我們可以看到,在表單中定義了提交地址是到Form模塊的insert操作,為了處理表單提交數(shù)據(jù),我們需要在FormAction類(lèi)中添加insert操作方法,如下:
class FormAction extends Action{ public function insert(){ $Form = D('Form'); if($Form->create()) { $result = $Form->add(); if($result) { $this->success('操作成功!'); }else{ $this->error('寫(xiě)入錯(cuò)誤!'); } }else{ $this->error($Form->getError()); } } }
如果你的主鍵是自增類(lèi)型的話,add方法的返回值就是該主鍵的值。不是自增主鍵的話,返回值表示插入數(shù)據(jù)的個(gè)數(shù)。如果返回false則表示寫(xiě)入出錯(cuò)。
3.模型
為了方便測(cè)試,我們首先在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)think_form表:
CREATE TABLE IF NOT EXISTS `think_form` ( `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` varchar(255) NOT NULL, `create_time` int(11) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
我們?cè)趇nsert操作方法中用了D函數(shù),和M函數(shù)不同,D函數(shù)需要有對(duì)應(yīng)的模型類(lèi),下面我們就來(lái)創(chuàng)建模型類(lèi)。模型類(lèi)的定義規(guī)范是:
模型名+Model.class.php (模型名的定義采用駝峰法并且首字母大寫(xiě))
我們?cè)陧?xiàng)目的Lib/Model 目錄下面創(chuàng)建FormModel.class.php文件,添加代碼如下:
class FormModel extends Model { // 定義自動(dòng)驗(yàn)證 protected $_validate = array( array('title','require','標(biāo)題必須'), ); // 定義自動(dòng)完成 protected $_auto = array( array('create_time','time',1,'function'), ); }
主要是用于表單的自動(dòng)驗(yàn)證和自動(dòng)完成,具體用法我們會(huì)用另外的篇幅單獨(dú)講述,這里暫時(shí)先略過(guò)。我們只要了解的是,如果使用D函數(shù)實(shí)例化模型類(lèi),一般需要對(duì)應(yīng)一個(gè)數(shù)據(jù)模型類(lèi),而且create方法會(huì)自動(dòng)把表單提交的數(shù)據(jù)進(jìn)行自動(dòng)驗(yàn)證和自動(dòng)完成(如果有定義的話),如果自動(dòng)驗(yàn)證失敗,就可以通過(guò)模型的getError方法獲取驗(yàn)證提示信息,如果驗(yàn)證通過(guò),就表示數(shù)據(jù)對(duì)象已經(jīng)成功創(chuàng)建,但目前只是保存在內(nèi)存中,直到我們調(diào)用add方法寫(xiě)入數(shù)據(jù)到數(shù)據(jù)庫(kù)。這樣就完成了一個(gè)完整的Create操作,所以可以看到ThinkPHP在創(chuàng)建數(shù)據(jù)的過(guò)程中使用了兩步:
第一步,create方法創(chuàng)建數(shù)據(jù)對(duì)象,
第二步,使用add方法把當(dāng)前的數(shù)據(jù)對(duì)象寫(xiě)入數(shù)據(jù)庫(kù)。
當(dāng)然,你完全可以跨過(guò)第一步,直接進(jìn)行第二步,但是這樣的預(yù)處理有幾個(gè)優(yōu)勢(shì):
1、無(wú)論表單有多復(fù)雜,create方法都可以用一行代碼輕松創(chuàng)建數(shù)據(jù)對(duì)象;
2、在寫(xiě)入數(shù)據(jù)之前,可以對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證和補(bǔ)充;
其實(shí)create方法還有很多的功能操作,目的只有一個(gè),確保寫(xiě)入數(shù)據(jù)庫(kù)的數(shù)據(jù)安全和有效。
我們來(lái)驗(yàn)證下表單提交的效果,當(dāng)我們不輸入標(biāo)題就直接提交表單的話,系統(tǒng)會(huì)給出標(biāo)題必須這樣的提示信息。
當(dāng)我們順利提交表單后,會(huì)看到寫(xiě)入數(shù)據(jù)表的數(shù)據(jù)中的create_time字段已經(jīng)有值了,這就是通過(guò)模型的自動(dòng)完成寫(xiě)入的。
如果你的數(shù)據(jù)完全是內(nèi)部操作寫(xiě)入而不是通過(guò)表單的話(也就是說(shuō)可以充分信任數(shù)據(jù)的安全),那么可以直接使用add方法,如:
$Form = D('Form'); $data['title'] = 'ThinkPHP'; $data['content'] = '表單內(nèi)容'; $Form->add($data);
也可以支持對(duì)象方式操作:
$Form = D('Form'); $Form->title = 'ThinkPHP'; $Form->content = '表單內(nèi)容'; $Form->add();
對(duì)象方式操作的時(shí)候,add方法無(wú)需傳入數(shù)據(jù),會(huì)自動(dòng)識(shí)別當(dāng)前的數(shù)據(jù)對(duì)象賦值。
4.讀取數(shù)據(jù)
當(dāng)我們成功寫(xiě)入數(shù)據(jù)后,就可以進(jìn)行數(shù)據(jù)讀取操作了。在前面一篇中,我們已經(jīng)知道可以用select方法獲取數(shù)據(jù)集,這里我們來(lái)通過(guò)find方法獲取一個(gè)單一數(shù)據(jù),定義read操作方法如下:
public function read($id=0){ $Form = M('Form'); // 讀取數(shù)據(jù) $data = $Form->find($id); if($data) { $this->data = $data;// 模板變量賦值 }else{ $this->error('數(shù)據(jù)錯(cuò)誤'); } $this->display(); }
read操作方法有一個(gè)參數(shù)$id,表示我們可以接受URL里面的id變量(后面我們會(huì)在變量章節(jié)詳細(xì)描述。這里之所以用M方法而沒(méi)有用D方法,是因?yàn)閒ind方法是基礎(chǔ)模型類(lèi)Model中的方法,所以沒(méi)有必要浪費(fèi)開(kāi)銷(xiāo)去實(shí)例化FormModel類(lèi)(即使已經(jīng)定義了FormModel類(lèi))。我們通常采用find方法讀取某個(gè)數(shù)據(jù),這里使用了AR模式來(lái)操作,所以沒(méi)有傳入查詢(xún)條件,find($id) 表示讀取主鍵為$id值的數(shù)據(jù),find方法的返回值是一個(gè)如下格式的數(shù)組:
array( 'id' => 5, 'title' => '測(cè)試標(biāo)題', 'content' => '測(cè)試內(nèi)容', 'status' => 1, )
然后我們可以在模板中輸出數(shù)據(jù),添加一個(gè)read模板文件:
<table> <tr> <td>id:</td> <td>{$data.id}</td> </tr> <tr> <td>標(biāo)題:</td> <td>{$data.title}</td> </tr> <tr> <td>內(nèi)容:</td> <td>{$data.content}</td> </tr> </table>
完成后,我們就可以訪問(wèn)
http://localhost/app/index.php/Form/read/id/1
來(lái)查看了。
如果你只需要查詢(xún)某個(gè)字段的值,還可以使用getField方法,例如:
$Form = M("Form"); // 獲取標(biāo)題 $title = $Form->where('id=3')->getField('title');
上面的用法表示獲取id值為3的數(shù)據(jù)的title字段值。其實(shí)getField方法有很多用法,但是獲取某個(gè)字段的值是getField方法最常規(guī)的用法。
查詢(xún)操作是最常用的操作,尤其是涉及到復(fù)雜的查詢(xún)條件,我們會(huì)在查詢(xún)語(yǔ)言一章對(duì)查詢(xún)進(jìn)行更加詳細(xì)的講解。
5.更新數(shù)據(jù)
在成功寫(xiě)入并讀取數(shù)據(jù)之后,我們就可以對(duì)數(shù)據(jù)進(jìn)行編輯操作了,首先我們添加一個(gè)編輯表單的模板文件edit.html,如下:
<FORM method="post" action="__URL__/update"> 標(biāo)題:<INPUT type="text" name="title" value="{$vo.title}"><br/> 內(nèi)容:<TEXTAREA name="content" rows="5" cols="45">{$vo.content}</TEXTAREA><br/> <INPUT type="hidden" name="id" value="{$vo.id}"> <INPUT type="submit" value="提交"> </FORM>
編輯模板不同于新增表單,需要對(duì)模板進(jìn)行變量賦值,所以,我們這次需要在FormAction類(lèi)添加兩個(gè)操作方法:
public function edit($id=0){ $Form = M('Form'); $this->vo = $Form->find($id); $this->display(); } public function update(){ $Form = D('Form'); if($Form->create()) { $result = $Form->save(); if($result) { $this->success('操作成功!'); }else{ $this->error('寫(xiě)入錯(cuò)誤!'); } }else{ $this->error($Form->getError()); } }
完成后,我們就可以訪問(wèn)
http://localhost/app/index.php/Form/edit/id/1
數(shù)據(jù)的更新操作在ThinkPHP使用save方法,可以看到,我們同樣可以使用create方法創(chuàng)建表單提交的數(shù)據(jù),而save方法則會(huì)自動(dòng)把當(dāng)前的數(shù)據(jù)對(duì)象更新到數(shù)據(jù)庫(kù),而更新的條件其實(shí)就是表的主鍵,這就是我們?cè)诰庉嬳?yè)面要把主鍵的值作為隱藏字段一起提交的原因。
如果更新操作不依賴(lài)表單的提交的話,就可以寫(xiě)成:
$Form = M("Form"); // 要修改的數(shù)據(jù)對(duì)象屬性賦值 $data['id'] = 5; $data['title'] = 'ThinkPHP'; $data['content'] = 'ThinkPHP3.1版本發(fā)布'; $Form->save($data); // 根據(jù)條件保存修改的數(shù)據(jù)
save方法會(huì)自動(dòng)識(shí)別數(shù)據(jù)對(duì)象中的主鍵字段,并作為更新條件。當(dāng)然,你也可以顯式的傳入更新條件:
$Form = M("Form"); // 要修改的數(shù)據(jù)對(duì)象屬性賦值 $data['title'] = 'ThinkPHP'; $data['content'] = 'ThinkPHP3.1版本發(fā)布'; $Form->where('id=5')->save($data); // 根據(jù)條件保存修改的數(shù)據(jù)
也可以改成對(duì)象方式來(lái)操作:
$Form = M("Form"); // 要修改的數(shù)據(jù)對(duì)象屬性賦值 $Form->title = 'ThinkPHP'; $Form->content = 'ThinkPHP3.1版本發(fā)布'; $Form->where('id=5')->save(); // 根據(jù)條件保存修改的數(shù)據(jù)
數(shù)據(jù)對(duì)象賦值的方式,save方法無(wú)需傳入數(shù)據(jù),會(huì)自動(dòng)識(shí)別。
save方法的返回值是影響的記錄數(shù),如果返回false則表示更新出錯(cuò)。
有些時(shí)候,我們只需要修改某個(gè)字段的值,就可以使用setField方法,而不需要每次都調(diào)用save方法。
$Form = M("Form"); // 更改title值 $Form->where('id=5')->setField('title','ThinkPHP');
對(duì)于統(tǒng)計(jì)字段,系統(tǒng)還提供了更加方便的setInc和setDec方法。
例如:
$User = M("User"); // 實(shí)例化User對(duì)象 $User->where('id=5')->setInc('score',3); // 用戶(hù)的積分加3 $User->where('id=5')->setInc('score'); // 用戶(hù)的積分加1 $User->where('id=5')->setDec('score',5); // 用戶(hù)的積分減5 $User->where('id=5')->setDec('score'); // 用戶(hù)的積分減1
6.刪除數(shù)據(jù)
刪除數(shù)據(jù)很簡(jiǎn)單,只需要調(diào)用delete方法,例如:
$Form = M('Form'); $Form->delete(5);
表示刪除主鍵為5的數(shù)據(jù),delete方法可以刪除單個(gè)數(shù)據(jù),也可以刪除多個(gè)數(shù)據(jù),這取決于刪除條件,例如:
$User = M("User"); // 實(shí)例化User對(duì)象 $User->where('id=5')->delete(); // 刪除id為5的用戶(hù)數(shù)據(jù) $User->delete('1,2,5'); // 刪除主鍵為1,2和5的用戶(hù)數(shù)據(jù) $User->where('status=0')->delete(); // 刪除所有狀態(tài)為0的用戶(hù)數(shù)據(jù)
delete方法的返回值是刪除的記錄數(shù),如果返回值是false則表示SQL出錯(cuò),返回值如果為0表示沒(méi)有刪除任何數(shù)據(jù)。
- ThinkPHP自定義Redis處理SESSION的實(shí)現(xiàn)方法
- 詳解thinkphp+redis+隊(duì)列的實(shí)現(xiàn)代碼
- ThinkPHP3.2框架操作Redis的方法分析
- thinkphp5框架擴(kuò)展redis類(lèi)方法示例
- thinkphp3.2.3版本的數(shù)據(jù)庫(kù)增刪改查實(shí)現(xiàn)代碼
- thinkPHP數(shù)據(jù)庫(kù)增刪改查操作方法實(shí)例詳解
- tp5(thinkPHP5)框架數(shù)據(jù)庫(kù)Db增刪改查常見(jiàn)操作總結(jié)
- thinkphp的CURD和查詢(xún)方式介紹
- Thinkphp中的curd應(yīng)用實(shí)用要點(diǎn)
- thinkPHP框架通過(guò)Redis實(shí)現(xiàn)增刪改查操作的方法詳解
相關(guān)文章
laravel 判斷查詢(xún)數(shù)據(jù)庫(kù)返回值的例子
今天小編就為大家分享一篇laravel 判斷查詢(xún)數(shù)據(jù)庫(kù)返回值的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10PHP隨機(jī)生成18位不重復(fù)的訂單號(hào)代碼實(shí)例
這篇文章主要介紹了PHP隨機(jī)生成18位不重復(fù)的訂單號(hào)代碼實(shí)例,代碼很簡(jiǎn)單但是很實(shí)用,有需要的同學(xué)可以參考下2021-03-03解決thinkphp5未定義變量會(huì)拋出異常,頁(yè)面錯(cuò)誤,請(qǐng)稍后再試的問(wèn)題
今天小編就為大家分享一篇解決thinkphp5未定義變量會(huì)拋出異常,頁(yè)面錯(cuò)誤,請(qǐng)稍后再試的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10php計(jì)算兩個(gè)日期時(shí)間差(返回年、月、日)
這篇文章主要介紹了php計(jì)算兩個(gè)日期時(shí)間差(返回年、月、日),實(shí)現(xiàn)了類(lèi)似微博中的多少天、多少月、多少前前功能,需要的朋友可以參考下2014-06-06淺談PHP調(diào)用Webservice思路及源碼分享
NuSoap是PHP環(huán)境下的WebService編程工具,用于創(chuàng)建或調(diào)用WebService。它是一個(gè)開(kāi)源軟件,是完全采用PHP語(yǔ)言編寫(xiě)的、通過(guò)HTTP收發(fā)SOAP消息的一系列PHP類(lèi)。NuSOAP的一個(gè)優(yōu)勢(shì)是不需要擴(kuò)展庫(kù)的支持,這種特性使得NuSoap可以用于所有的PHP環(huán)境,不受服務(wù)器安全設(shè)置的影響。2014-06-06php和jquery實(shí)現(xiàn)地圖區(qū)域數(shù)據(jù)統(tǒng)計(jì)展示數(shù)據(jù)示例
我們要在地圖上有限的區(qū)塊內(nèi)展示更多的信息,更好的辦法是通過(guò)地圖交互來(lái)實(shí)現(xiàn)。本文將給大家講解通過(guò)鼠標(biāo)滑動(dòng)到地圖指定省份區(qū)域,在彈出的提示框中顯示對(duì)應(yīng)省份的數(shù)據(jù)信息。適用于數(shù)據(jù)統(tǒng)計(jì)和地圖區(qū)塊展示等場(chǎng)景2014-02-02- 很多朋友不清楚php中sql查詢(xún)語(yǔ)句的id=%d的意思,今天小編通過(guò)本文給大家詳細(xì)介紹下PHP中SQL查詢(xún)語(yǔ)句的id=%d解釋?zhuān)枰呐笥褏⒖枷掳?/div> 2016-12-12
最新評(píng)論