WIKI使用導(dǎo)航
站長百科導(dǎo)航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營銷
- 虛擬主機(jī)管理系統(tǒng)
- 開放平臺
- WIKI程序與應(yīng)用
- 美國十大主機(jī)
ThinkPHP開發(fā)指南-模型之CURD操作
導(dǎo)航:上一頁
ThinkPHP提供了靈活和方便的數(shù)據(jù)操作方法,對數(shù)據(jù)庫操作的四個基本操作(CURD):創(chuàng)建、更新、讀取和刪除的實(shí)現(xiàn)是最基本的,也是必須掌握的,在這基礎(chǔ)之上才能熟悉更多實(shí)用的數(shù)據(jù)操作方法。CURD操作通常是可以和連貫操作配合完成的。下面來分析下各自的用法:
(下面的CURD操作我們均以M方法創(chuàng)建模型實(shí)例來說明,因?yàn)椴簧婕暗骄唧w的業(yè)務(wù)邏輯)
- 創(chuàng)建操作
在ThinkPHP使用add方法新增數(shù)據(jù)到數(shù)據(jù)庫。使用方法如下:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 $data['name'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $User->add($data);
或者使用data方法連貫操作
PHP代碼
$User->data($data)->add();
如果在add之前已經(jīng)創(chuàng)建數(shù)據(jù)對象的話(例如使用了create或者data方法),add方法就不需要再傳入數(shù)據(jù)了。使用create方法的例子:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 根據(jù)表單提交的POST數(shù)據(jù)創(chuàng)建數(shù)據(jù)對象 $User->create(); $User->add(); // 根據(jù)條件保存修改的數(shù)據(jù)
如果你的主鍵是自動增長類型,并且如果插入數(shù)據(jù)成功的話,Add方法的返回值就是最新插入的主鍵值,可以直接獲取。
- 讀取數(shù)據(jù)
在ThinkPHP中讀取數(shù)據(jù)的方式很多,通常分為讀取數(shù)據(jù)和讀取數(shù)據(jù)集。讀取數(shù)據(jù)集使用findall或者select方法(findall和select方法等效):
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 查找status值為1的用戶數(shù)據(jù) 以創(chuàng)建時間排序 返回10條數(shù)據(jù) $list = $User->where('status=1')->order('create_time')->limit(10)->select();
select方法的返回值是一個二維數(shù)組,如果沒有查詢到任何結(jié)果的話,也是返回一個空的數(shù)組。配合上面提到的連貫操作方法可以完成復(fù)雜的數(shù)據(jù)查詢。而最復(fù)雜的連貫方法應(yīng)該是where方法的使用,因?yàn)檫@部分涉及的內(nèi)容較多,我們會在查詢語言部分就如何進(jìn)行組裝查詢條件進(jìn)行詳細(xì)的使用說明。基本的查詢暫時不涉及關(guān)聯(lián)查詢部分,而是統(tǒng)一采用關(guān)聯(lián)模型來進(jìn)行數(shù)據(jù)操作,這一部分請參考關(guān)聯(lián)模型部分。
讀取數(shù)據(jù)使用find方法:
讀取數(shù)據(jù)的操作其實(shí)和數(shù)據(jù)集的類似,select可用的所有連貫操作方法也都可以用于find方法,區(qū)別在于find方法最多只會返回一條記錄,因此limit方法對于find查詢操作是無效的。
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 查找status值為1name值為think的用戶數(shù)據(jù) $User->where('status=1 AND name="think" ')->find();
即使?jié)M足條件的數(shù)據(jù)不止一條,find方法也只會返回第一條記錄。如果要讀取某個字段的值,可以使用getField方法,例如:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 獲取ID為3的用戶的昵稱 $nickname = $User->where('id=3')->getField('nickname');
當(dāng)只有一個字段的時候,始終返回一個值。如果傳入多個字段的話,可以返回一個關(guān)聯(lián)數(shù)組:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 獲取所有用戶的ID和昵稱列表 $list = $User->getField('id,nickname');
返回的list是一個數(shù)組,鍵名是用戶的id, 鍵值是用戶的昵稱nickname。
- 更新數(shù)據(jù)
在ThinkPHP中使用save方法更新數(shù)據(jù)庫,并且也支持連貫操作的使用。
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 要修改的數(shù)據(jù)對象屬性賦值 $data['name'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $User->where('id=5')->save($data); // 根據(jù)條件保存修改的數(shù)據(jù)
為了保證數(shù)據(jù)庫的安全,避免出錯更新整個數(shù)據(jù)表,如果沒有任何更新條件,數(shù)據(jù)對象本身也不包含主鍵字段的話,save方法不會更新任何數(shù)據(jù)庫的記錄。因此下面的代碼不會更改數(shù)據(jù)庫的任何記錄
PHP代碼
$User->save($data);
除非使用下面的方式:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 要修改的數(shù)據(jù)對象屬性賦值 $data['id'] = 5; $data['name'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $User->save($data); // 根據(jù)條件保存修改的數(shù)據(jù)
如果id是數(shù)據(jù)表的主鍵的話,系統(tǒng)自動會把主鍵的值作為更新條件來更新其他字段的值。還有一種方法是通過create或者data方法創(chuàng)建要更新的數(shù)據(jù)對象,然后進(jìn)行保存操作,這樣save方法的參數(shù)可以不需要傳入。
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 要修改的數(shù)據(jù)對象屬性賦值
PHP代碼
$data['name'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $User->where('id=5')->data($data)->save(); // 根據(jù)條件保存修改的數(shù)據(jù)
使用create方法的例子:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 根據(jù)表單提交的POST數(shù)據(jù)創(chuàng)建數(shù)據(jù)對象 $User->create(); $User->save(); // 根據(jù)條件保存修改的數(shù)據(jù)
上面的情況,表單中必須包含一個以主鍵為名稱的隱藏域,才能完成保存操作。如果只是更新個別字段的值,可以使用setField方法:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 更改用戶的name值 $User-> where('id=5')->setField('name','ThinkPHP');
setField方法支持同時更新多個字段,只需要傳入數(shù)組即可,例如:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 // 更改用戶的name和email的值 $User-> where('id=5')->setField(array('name','email'),array('ThinkPHP','ThinkPHP@gmail.com'));
而對于統(tǒng)計(jì)字段(通常指的是數(shù)字類型)的更新,系統(tǒng)還提供了setInc和setDec方法:
PHP代碼
$User = M("User"); // 實(shí)例化User對象 $User->setInc('score','id=5',3); // 用戶的積分加3 $User->setInc('score','id=5'); // 用戶的積分加1 $User->setDec('score','id=5',5); // 用戶的積分減5 $User->setDec('score','id=5'); // 用戶的積分減1
- 刪除數(shù)據(jù)
在ThinkPHP中使用delete方法刪除數(shù)據(jù)庫中的記錄。同樣可以使用連貫操作進(jìn)行刪除操作。
PHP代碼
$User = M("User"); // 實(shí)例化User對象 $User->where('id=5')->delete(); // 刪除id為5的用戶數(shù)據(jù) $User->where('status=0')->delete(); // 刪除所有狀態(tài)為0的用戶數(shù)據(jù)
delete方法可以用于刪除單個或者多個數(shù)據(jù),主要取決于刪除條件,也就是where方法的參數(shù),也可以用order和limit方法來限制要刪除的個數(shù),例如:
// 刪除所有狀態(tài)為0的5 個用戶數(shù)據(jù) 按照創(chuàng)建時間排序
PHP代碼
$User->where('status=0')->order('create_time')->limit('5')->delete();