在
上一篇中,我們了解了ThinkPHP的基礎部分,以及如何建立一個控制器和模板,並知道了M方法的用法,本篇將會講解下資料的CURD操作,探索下更多的資料操作。
CURD
CURD是一個資料庫技術中的縮寫詞,一般的專案所發展的各種參數的基本功能都是CURD。它代表創建(Create)、更新(Update)、讀取(Read)和刪除(Delete)操作。 CURD 定義了用於處理資料的基本原子操作。之所以將CURD 提升到技術難題的高度是因為完成一個涉及在多個資料庫系統中進行CURD操作的匯總相關的活動,其效能可能會隨資料關係的變化而有非常大的差異。
CURD在具體的應用中並非一定使用create、update 、read和delete字樣的方法,但是他們完成的功能是一致的。例如,ThinkPHP就是使用add、save、select和delete方法表示模型的CURD操作。
建立資料
大多數情況下,CURD的Create作業通常會透過表單來提交數據,首先,我們在專案的Tpl/Form 目錄下方建立一個add.html 範本文件,內容為:
然後,我們還需要在專案的Action目錄下面建立一個專案的Action目錄下面建立一個專案的Action目錄下面FormAction.class.php文件,暫時只需要定義FormAction類,不需要新增任何操作方法,程式碼如下:
class FormAction extends Action{
}
接下來,造訪
http://localhost/app/ index.php/Form/add
就可以看到表單頁了,我們並沒有在控制器裡面定義add操作方法,但是很顯然,存取是正常的。因為ThinkPHP在沒有找到對應操作方法的情況下,會檢查是否存在對應的模板文件,由於我們有對應的add模板文件,所以控制器就直接渲染該模板文件輸出了。所以說對於沒有任何實際邏輯的操作方法,我們只需要直接定義對應的模板檔案就行了。
我們可以看到,在表單中定義了提交地址是到Form模組的insert操作,為了處理表單提交數據,我們需要在FormAction類別中添加insert操作方法,如下:
class FormAction extends Action{
function insert(){
$Form = D('Form');
$result = $Form->add();
if($result) {
$this->success('操作成功!');
$this->error('寫入錯誤!');
}
🎠 >error($Form->getError()); } }}如果你的主鍵是自增法}}如果你的主鍵是自增值}}如果你的主鍵是自增法的話,該方法的值的值。不是自增主鍵的話,回傳值表示插入資料的個數。如果傳回false則表示寫入出錯。 模型為了方便測試,我們先在資料庫中建立一個think_form表:CREATE TABLE IF NOT EXISTS `think_form` TABLE IF NOT EXISTS `think_form` TABLE IF NOT EXISTS `think_form` TABLE IF NOT EXISTS `think_form` (M TO_INCREMENT,`title` varchar(255) NOT NULL,
`content` varchar(255) NOT NULL,
`create_time` NOT NULL,
`create_time` int(11) (`id`)
) ENGINE= MyISAM DEFAULT CHARSET=utf8 ;
我們在insert操作方法中用了D函數,和M函數不同,D函數需要有對應的模型類,下面我們就來創建模型類。模型類別的定義規格是:模型名稱+Model.class.php (模型名稱的定義採用駝峰法並且首字母大寫)
我們在專案的Lib/Model 目錄下方建立FormModel.class.php文件,新增程式碼如下:
class FormModel extends Model {
// 定義自動驗證
protec母親title','require','標題必須'),
);
// 定義自動完成
protected $_auto = array(
array('create_time','time',11,'unction),1
}
主要是用於表單的自動驗證和自動完成,具體用法我們會用另外的篇幅單獨講述,這裡暫時先略過。我們只要了解的是,如果使用D函數實例化模型類,一般需要對應一個資料模型類,而且create方法會自動把表單提交的資料進行自動驗證和自動完成(如果有定義的話),如果自動驗證失敗,就可以透過模型的getError方法獲取驗證提示信息,如果驗證通過,就表示數據對像已經成功創建,但目前只是保存在內存中,直到我們調用add方法寫入數據到數據庫。這樣就完成了一個完整的Create操作,所以可以看到ThinkPHP在創建數據的過程中使用了兩步:
第一步,create方法創建數據對象,第二步,使用add方法把當前的數據對象寫入資料庫。
當然,你完全可以跨過第一步,直接進行第二步,但是這樣的預處理有幾個優勢:1、無論表單有多複雜,create方法都可以用一行程式碼輕鬆建立資料物件;
2.在寫入資料之前,可以對資料進行驗證補充;
其實create方法還有很多的功能操作,目的只有一個,確保寫入資料庫的資料安全且有效。
我們來驗證下表單提交的效果,當我們不輸入標題就直接提交表單的話,系統會給出標題必須這樣的提示訊息。
$Form = ');
$data['title'] = 'ThinkPHP';
$data['content'] = '表單內容';
$Form-c($Form);方式操作:
$Form = D('Form');
$Form->title = 'ThinkPHP';
$Form> 物件方式操作的時候,add方法無需傳入數據,會自動辨識目前的資料物件賦值。 讀取資料當我們成功寫入資料後,就可以進行資料讀取操作了。在前面一篇中,我們已經知道可以用select方法取得資料集,這裡我們來透過find方法取得單一數據,定義read操作方法如下:public function read($id=0){ $Form = M('Form'); // 讀取資料 $data = $Form->find($id) this->data = $data;/ / 模板變數賦值 }else{ $this->error('資料錯誤');}
$this->display();
}
read操作方法有一個參數$id,表示我們可以接受URL裡面的id變數(後面我們會這裡在章節章節上詳細描述。方法而沒有用D方法,是因為find方法是基礎模型類別Model中的方法,所以沒有必要浪費開銷去實例化FormModel類別(即使已經定義了FormModel類別)。這裡使用了AR模式來操作,所以沒有傳入查詢條件,find($id) 表示讀取主鍵為$id值的數據,find方法的回傳值是一個如下格式的陣列:
array(
' id' => 5,
'title' => '測驗標題',🎠 'status' => 1,
)
然後我們可以在模板中輸出數據,新增一個read模板文件,
id: | {$data.id} | {$data.id} | >
標題: | {$data.title} | {$data.content} |
// 取得標題
$title = $Form->where('id=3')->getField('title');
上面的用法表示取得id值為3的資料的title欄位值。 getField方法有很多用法,但是取得某個欄位的值是getField方法最常規的用法。詳細的講解。 FORM method="post" action="/Article/update">
標題:
{$vo.content}
$Form = );
$this->display();
}
public function update(){
$Formh; )) {
$result = $Form->save();
if($result) {
');
}else{
$this->error('寫{
$this->error($Form->getError());
}
}
完成後,我們可以存取
http://localhost/app/index.php/Form/edit/id/1
資料的更新操作在ThinkPHP使用save方法,可以看到,我們同樣可以使用create方法建立表單提交的資料,而save方法則會自動把目前的資料物件更新到資料庫,而更新的條件其實就是表的主鍵,這就是我們在編輯頁面要把主鍵的值作為隱藏欄位一起提交的原因。
如果更新作業不依賴表單的提交的話,就可以寫成:
$Form = M("Form");
// 要修改的資料物件屬性賦值
$data['id'] 要修改的資料物件屬性賦值
$data['id'] 要修改55;
$data['title'] = 'ThinkPHP';
$data['content'] = 'ThinkPHP3.1版本發布';
$Form->save($data); // 的資料
save方法會自動識別資料物件中的主鍵字段,並作為更新條件。當然,你也可以明確的傳入更新條件:
$Form = M("Form");
// 要修改的資料物件屬性賦值
$data['title'] = 'ThinkPHP';
$data['content'] = 'ThinkPHP3.1版本發佈';
$Form->where('id=5')->save($data); // 依照條件保存修改的資料
也可以改成物件方式操作:
$Form = M("Form");
// 要修改的資料物件屬性賦值
$Form->title = 'ThinkPHP';
$Form->title = 'ThinkPHP';
$Form->title = 'ThinkPHP';
$Form->title = 'ThinkPHP';
$Form->where('id=5')->save(); // 根據條件保存修改的資料
資料物件賦值的方式,save方法無須傳入數據,會自動識別。
save方法的回傳值是影響的記錄數,如果傳回false則表示更新出錯。 有些時候,我們只需要修改某個欄位的值,就可以使用setField方法,而不需要每次都呼叫save方法。 $Form = M("Form"); // 更改title值$Form->where('id=5')->setField('title','ThinkPHP');;字段,系統還提供了更方便的setInc和setDec方法。例如:
$User = M("User"); // 實例化User物件
$User->where('id=5')->setInc('score',3$User->where('id=5')->setInc('score',3); 積分加3
$User->where('id=5')->setInc('score'); // 用戶的點數加1
('score',5); // 用戶的積分減5
$User->where('id=5')->setDec('score'); // 用戶的積分減1
資料刪除資料很簡單,只需要呼叫delete方法,例如:$Form = M('Form');$Form->delete(5);表示刪除主鍵為5的數據,delete->delete(5);表示刪除主鍵為5的數據,delete方法可以刪除單一數據,也可以刪除多個數據,這取決於刪除條件,例如:$User = M("User"); // 實例化User物件$User->where('id= 5')->delete(); // 刪除id為5的使用者資料
$User->delete('1,2,5'); // 刪除主鍵為1,2和5的使用者資料
$User->where('status=0')->delete(); // 刪除所有狀態為0的使用者資料
delete方法的回傳值是刪除的記錄數,如果傳回值為false則表示SQL出錯,傳回值如果為0表示沒有刪除任何資料。