thinkphp CURD操作

6.13 CURD操作

ThinkPHP提供了靈活和方便的數據操作方法,對數據庫操作的四個基本操作(CURD):創建、更新、讀取和刪除的實現是最基本的,也是必須掌握的,在這基礎之上才能熟悉更多實用的數據操作方法。CURD操作通常是可以和連貫操作配合完成的。下面來分析下各自的用法:
(下面的CURD操作我們均以M方法創建模型實例來說明,因爲不涉及到具體的業務邏輯)
2

創建(Create)

在ThinkPHP中使用add方法新增數據到數據庫(而並不是create方法)。
add  寫入(新增)數據到數據庫
用法 add($data='',$options=array(),$replace=false)
參數

data(可選):要新增的數據,支持數組和對象,如果留空取當前數據對象


options(可選):操作表達式,通常由連貫操作完成,默認爲空數組


replace(可選):是否允許寫入時更新,默認爲false(個別數據庫支持)

回調接口

寫入前 _before_insert(&$data,$options)


寫入成功 _after_insert($data,$options)

返回值

如果數據非法或者查詢錯誤則返回false


如果是自增主鍵 則返回主鍵值,否則返回1

相關方法 通常和data、create方法配合使用
使用示例如下:
  1. $User = M("User"); // 實例化User對象
  2. $data['name'] = 'ThinkPHP';
  3. $data['email'] = '[email protected]';
  4. $User->add($data);
或者使用data方法連貫操作
  1. $User->data($data)->add();
如果在add之前已經創建數據對象的話(例如使用了create或者data方法),add方法就不需要再傳入數據了。
使用create方法的例子:
  1. $User = M("User"); // 實例化User對象
  2. // 根據表單提交的POST數據創建數據對象
  3. $User->create();
  4. $User->add(); // 根據條件保存修改的數據
如果你的主鍵是自動增長類型,並且如果插入數據成功的話,Add方法的返回值就是最新插入的主鍵值,可以直接獲取。
從2.1版開始恢復了批量插入數據的addAll方法(僅針對Mysql數據庫),如:
  1. $User->addAll($data)
同時在數據插入時允許更新操作:
  1. add($data='',$options=array(),$replace=false)
其中add方法增加$replace參數(是否添加數據時允許覆蓋),true表示覆蓋,默認爲false
8

讀取(Read)

在ThinkPHP中讀取數據的方式很多,通常分爲讀取數據和讀取數據集。
讀取數據集使用select方法(新版已經廢除原來的findall方法):
select 查詢數據集
用法 select($options=array())
參數 options(可選):爲數組的時候表示操作表達式,通常由連貫操作完成;如果是數字或者字符串,表示主鍵值。默認爲空數組。
回調接口 查詢成功 _after_select(&$resultSet,$options)
返回值

查詢錯誤返回false


查詢結果爲空返回null


查詢成功返回查詢的結果集(二維索引數組)

相關方法 通常配合連貫操作where、field、order、limit、join等一起使用
使用示例:
  1. $User = M("User"); // 實例化User對象
  2. // 查找status值爲1的用戶數據 以創建時間排序 返回10條數據
  3. $list = $User->where('status=1')->order('create_time')->limit(10)->select();
Select方法配合連貫操作方法可以完成複雜的數據查詢。而最複雜的連貫方法應該是where方法的使用,因爲這部分涉及的內容較多,我們會在查詢語言部分就如何進行組裝查詢條件進行詳細的使用說明。基本的查詢暫時不涉及關聯查詢部分,而是統一採用關聯模型來進行數據操作,這一部分請參考關聯模型部分。
2
讀取數據使用find方法:
find 查詢數據
用法 find($options=array())
參數 options(可選):爲數組的時候表示操作表達式,通常由連貫操作完成;爲數字或者字符串的時候表示主鍵值。默認爲空數組。
回調接口 查詢後 _after_find(&$result,$options)
返回值

如果查詢錯誤返回false


如果查詢結果爲空返回null


如果查詢成功返回查詢的結果(索引數組)

相關方法 通常配合連貫操作where、field、order、join等一起使用
讀取數據的操作其實和數據集的類似,select可用的所有連貫操作方法也都可以用於find方法,區別在於find方法最多隻會返回一條記錄,因此limit方法對於find查詢操作是無效的。
下面是一些查詢的例子:
  1. $User = M("User"); // 實例化User對象
  2. // 查找status值爲1name值爲think的用戶數據 
  3. $User->where('status=1 AND name="think"')->find();
即使滿足條件的數據不止一條,find方法也只會返回第一條記錄。
1
如果要讀取某個字段的值,可以使用getField方法
getField 查詢某個字段的值
用法 getField($field,$sepa=null)
參數

field(必須):要獲取的字段字符串(多個用逗號分隔)


sepa(可選):字段數據間隔符號,如果是 NULL返回數組爲數組。默認爲null。

回調接口 查詢後 _after_find(&$result,$options)
返回值

如果查詢結果爲空返回null


如果field是一個字段則返回該字段的值


如果field是多個字段,返回數組。數組的索引是第一個字段的值,sepa爲null則返回二維數組。

相關方法 通常配合連貫操作where、limit、order等一起使用
示例如下:
  1. $User = M("User"); // 實例化User對象
  2. // 獲取ID爲3的用戶的暱稱 
  3. $nickname = $User->where('id=3')->getField('nickname');
當只有一個字段的時候,默認返回一個值。
如果需要返回數組,可以用:
  1. $this->getField('id',true); // 獲取id數組
如果傳入多個字段的話,默認返回一個關聯數組:
  1. $User = M("User"); // 實例化User對象
  2. // 獲取所有用戶的ID和暱稱列表 
  3. $list = $User->getField('id,nickname');
返回的list是一個數組,鍵名是用戶的id, 鍵值是用戶的暱稱nickname。
如果傳入多個字段的名稱,例如:
  1. $list = $User->getField('id,nickname,email');
返回的是一個二維數組,類似select方法的返回結果,區別的是這個二維數組的鍵名是用戶的id(準確的說是getField方法的第一個字段名)。
如果我們傳入一個字符串分隔符:
  1. $list = $User->getField('id,nickname,email',':');
那麼返回的結果就是一個數組,鍵名是用戶id,鍵值是 nickname:email的輸出字符串。

getField方法的sepa參數還可以支持限制數量,例如:
  1. $this->getField('id,name',5); // 限制返回5條記錄
  2. $this->getField('id',3); // 獲取id數組 限制3條記錄
可以配合使用order方法使用。
6

更新(Update)

在ThinkPHP中使用save方法更新數據庫,並且也支持連貫操作的使用。
save 更新數據到數據庫
用法 save($data='',$options=array())
參數

data:要保存的數據,如果爲空,則取當前的數據對象。


options:爲數組的時候表示操作表達式,通常由連貫操作完成;爲數字或者字符串的時候表示主鍵值。默認爲空數組。

回調接口

更新前_before_update(&$data,$options)


更新成功後 _after_update($data,$options)

返回值

如果查詢錯誤或者數據非法返回false


如果更新成功返回影響的記錄數

相關方法 通常配合連貫操作where、field、order等一起使用
  1. $User = M("User"); // 實例化User對象
  2. // 要修改的數據對象屬性賦值
  3. $data['name'] = 'ThinkPHP';
  4. $data['email'] = '[email protected]';
  5. $User->where('id=5')->save($data); // 根據條件保存修改的數據
爲了保證數據庫的安全,避免出錯更新整個數據表,如果沒有任何更新條件,數據對象本身也不包含主鍵字段的話,save方法不會更新任何數據庫的記錄。
因此下面的代碼不會更改數據庫的任何記錄
  1. $User->save($data); 
除非使用下面的方式:
  1. $User = M("User"); // 實例化User對象
  2. // 要修改的數據對象屬性賦值
  3. $data['id'] = 5;
  4. $data['name'] = 'ThinkPHP';
  5. $data['email'] = '[email protected]';
  6. $User->save($data); // 根據條件保存修改的數據
如果id是數據表的主鍵的話,系統自動會把主鍵的值作爲更新條件來更新其他字段的值。
還有一種方法是通過create或者data方法創建要更新的數據對象,然後進行保存操作,這樣save方法的參數可以不需要傳入。
  1. $User = M("User"); // 實例化User對象
  2. // 要修改的數據對象屬性賦值
  3. $data['name'] = 'ThinkPHP';
  4. $data['email'] = '[email protected]';
  5. $User->where('id=5')->data($data)->save(); // 根據條件保存修改的數據
使用create方法的例子:
  1. $User = M("User"); // 實例化User對象
  2. // 根據表單提交的POST數據創建數據對象
  3. $User->create();
  4. $User->save(); // 根據條件保存修改的數據
上面的情況,表單中必須包含一個以主鍵爲名稱的隱藏域,才能完成保存操作。
如果只是更新個別字段的值,可以使用setField方法。
setField 更新某個字段的值
用法 setField($field,$value='')
參數 options(可選):爲數組的時候表示操作表達式,通常由連貫操作完成;爲數字或者字符串的時候表示主鍵值。默認爲空數組。
返回值

如果查詢錯誤返回false


如果更新成功返回影響的記錄數

相關方法 必須配合連貫操作where一起使用
使用示例:
  1. $User = M("User"); // 實例化User對象
  2. // 更改用戶的name值
  3. $User-> where('id=5')->setField('name','ThinkPHP');
setField方法支持同時更新多個字段,只需要傳入數組即可,例如:
  1. $User = M("User"); // 實例化User對象
  2. // 更改用戶的name和email的值
  3. $data = array('name'=>'ThinkPHP','email'=>'[email protected]');
  4. $User-> where('id=5')->setField($data);
2
而對於統計字段(通常指的是數字類型)的更新,系統還提供了setInc和setDec方法。
setInc /setDec 字段增長/字段減少
用法

setInc($field,$step=1)字段值增長


setDec($field,$step=1)字段值減少

參數

field:要更新的字段名。


step:增長或者減少的數值,默認爲1。

回調接口

如果查詢錯誤返回false


如果更新成功返回影響的記錄數

返回值

如果查詢錯誤返回false


如果更新成功返回影響的記錄數

相關方法 必須配合連貫操作where一起使用
  1. $User = M("User"); // 實例化User對象
  2. $User->where('id=5')->setInc('score',3); // 用戶的積分加3
  3. $User->where('id=5')->setInc('score'); // 用戶的積分加1
  4. $User->where('id=5')->setDec('score',5); // 用戶的積分減5
  5. $User->where('id=5')->setDec('score'); // 用戶的積分減1
2

刪除(Delete)

在ThinkPHP中使用delete方法刪除數據庫中的記錄。
用法 delete($options=array())
參數 options:爲數組的時候表示操作表達式,通常由連貫操作完成,如果沒有傳入任何刪除條件,則取當前數據對象的主鍵作爲條件;爲數字或者字符串的時候表示主鍵值。默認爲空數組。
回調接口 刪除成功後 _after_delete($data,$options)
返回值

如果查詢錯誤返回false


如果刪除成功返回影響的記錄數

相關方法 通常配合連貫操作where、field、order等一起使用
示例如下:
  1. $User = M("User"); // 實例化User對象
  2. $User->where('id=5')->delete(); // 刪除id爲5的用戶數據
  3. $User->where('status=0')->delete(); // 刪除所有狀態爲0的用戶數據
delete方法可以用於刪除單個或者多個數據,主要取決於刪除條件,也就是where方法的參數,也可以用order和limit方法來限制要刪除的個數,例如:
  1. // 刪除所有狀態爲0的5 個用戶數據 按照創建時間排序
  2. $User->where('status=0')->order('create_time')->limit('5')->delete();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章