6.13 CURD操作
(下面的CURD操作我們均以M方法創建模型實例來說明,因爲不涉及到具體的業務邏輯)
創建(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方法配合使用 |
- $User = M("User"); // 實例化User對象
- $data['name'] = 'ThinkPHP';
- $data['email'] = '[email protected]';
- $User->add($data);
- $User->data($data)->add();
使用create方法的例子:
- $User = M("User"); // 實例化User對象
- // 根據表單提交的POST數據創建數據對象
- $User->create();
- $User->add(); // 根據條件保存修改的數據
從2.1版開始恢復了批量插入數據的addAll方法(僅針對Mysql數據庫),如:
- $User->addAll($data)
- add($data='',$options=array(),$replace=false)
讀取(Read)
在ThinkPHP中讀取數據的方式很多,通常分爲讀取數據和讀取數據集。讀取數據集使用select方法(新版已經廢除原來的findall方法):
select 查詢數據集 | |
---|---|
用法 | select($options=array()) |
參數 | options(可選):爲數組的時候表示操作表達式,通常由連貫操作完成;如果是數字或者字符串,表示主鍵值。默認爲空數組。 |
回調接口 | 查詢成功 _after_select(&$resultSet,$options) |
返回值 |
查詢錯誤返回false 查詢結果爲空返回null 查詢成功返回查詢的結果集(二維索引數組) |
相關方法 | 通常配合連貫操作where、field、order、limit、join等一起使用 |
- $User = M("User"); // 實例化User對象
- // 查找status值爲1的用戶數據 以創建時間排序 返回10條數據
- $list = $User->where('status=1')->order('create_time')->limit(10)->select();
find 查詢數據 | |
---|---|
用法 | find($options=array()) |
參數 | options(可選):爲數組的時候表示操作表達式,通常由連貫操作完成;爲數字或者字符串的時候表示主鍵值。默認爲空數組。 |
回調接口 | 查詢後 _after_find(&$result,$options) |
返回值 |
如果查詢錯誤返回false 如果查詢結果爲空返回null 如果查詢成功返回查詢的結果(索引數組) |
相關方法 | 通常配合連貫操作where、field、order、join等一起使用 |
下面是一些查詢的例子:
- $User = M("User"); // 實例化User對象
- // 查找status值爲1name值爲think的用戶數據
- $User->where('status=1 AND name="think"')->find();
getField 查詢某個字段的值 | |
---|---|
用法 | getField($field,$sepa=null) |
參數 |
field(必須):要獲取的字段字符串(多個用逗號分隔) sepa(可選):字段數據間隔符號,如果是 NULL返回數組爲數組。默認爲null。 |
回調接口 | 查詢後 _after_find(&$result,$options) |
返回值 |
如果查詢結果爲空返回null 如果field是一個字段則返回該字段的值 如果field是多個字段,返回數組。數組的索引是第一個字段的值,sepa爲null則返回二維數組。 |
相關方法 | 通常配合連貫操作where、limit、order等一起使用 |
- $User = M("User"); // 實例化User對象
- // 獲取ID爲3的用戶的暱稱
- $nickname = $User->where('id=3')->getField('nickname');
如果需要返回數組,可以用:
- $this->getField('id',true); // 獲取id數組
- $User = M("User"); // 實例化User對象
- // 獲取所有用戶的ID和暱稱列表
- $list = $User->getField('id,nickname');
如果傳入多個字段的名稱,例如:
- $list = $User->getField('id,nickname,email');
如果我們傳入一個字符串分隔符:
- $list = $User->getField('id,nickname,email',':');
getField方法的sepa參數還可以支持限制數量,例如:
- $this->getField('id,name',5); // 限制返回5條記錄
- $this->getField('id',3); // 獲取id數組 限制3條記錄
更新(Update)
在ThinkPHP中使用save方法更新數據庫,並且也支持連貫操作的使用。save 更新數據到數據庫 | |
---|---|
用法 | save($data='',$options=array()) |
參數 |
data:要保存的數據,如果爲空,則取當前的數據對象。 options:爲數組的時候表示操作表達式,通常由連貫操作完成;爲數字或者字符串的時候表示主鍵值。默認爲空數組。 |
回調接口 |
更新前_before_update(&$data,$options) 更新成功後 _after_update($data,$options) |
返回值 |
如果查詢錯誤或者數據非法返回false 如果更新成功返回影響的記錄數 |
相關方法 | 通常配合連貫操作where、field、order等一起使用 |
- $User = M("User"); // 實例化User對象
- // 要修改的數據對象屬性賦值
- $data['name'] = 'ThinkPHP';
- $data['email'] = '[email protected]';
- $User->where('id=5')->save($data); // 根據條件保存修改的數據
因此下面的代碼不會更改數據庫的任何記錄
- $User->save($data);
- $User = M("User"); // 實例化User對象
- // 要修改的數據對象屬性賦值
- $data['id'] = 5;
- $data['name'] = 'ThinkPHP';
- $data['email'] = '[email protected]';
- $User->save($data); // 根據條件保存修改的數據
還有一種方法是通過create或者data方法創建要更新的數據對象,然後進行保存操作,這樣save方法的參數可以不需要傳入。
- $User = M("User"); // 實例化User對象
- // 要修改的數據對象屬性賦值
- $data['name'] = 'ThinkPHP';
- $data['email'] = '[email protected]';
- $User->where('id=5')->data($data)->save(); // 根據條件保存修改的數據
- $User = M("User"); // 實例化User對象
- // 根據表單提交的POST數據創建數據對象
- $User->create();
- $User->save(); // 根據條件保存修改的數據
如果只是更新個別字段的值,可以使用setField方法。
setField 更新某個字段的值 | |
---|---|
用法 | setField($field,$value='') |
參數 | options(可選):爲數組的時候表示操作表達式,通常由連貫操作完成;爲數字或者字符串的時候表示主鍵值。默認爲空數組。 |
返回值 |
如果查詢錯誤返回false 如果更新成功返回影響的記錄數 |
相關方法 | 必須配合連貫操作where一起使用 |
- $User = M("User"); // 實例化User對象
- // 更改用戶的name值
- $User-> where('id=5')->setField('name','ThinkPHP');
- $User = M("User"); // 實例化User對象
- // 更改用戶的name和email的值
- $data = array('name'=>'ThinkPHP','email'=>'[email protected]');
- $User-> where('id=5')->setField($data);
setInc /setDec 字段增長/字段減少 | |
---|---|
用法 |
setInc($field,$step=1)字段值增長 setDec($field,$step=1)字段值減少 |
參數 |
field:要更新的字段名。 step:增長或者減少的數值,默認爲1。 |
回調接口 |
如果查詢錯誤返回false 如果更新成功返回影響的記錄數 |
返回值 |
如果查詢錯誤返回false 如果更新成功返回影響的記錄數 |
相關方法 | 必須配合連貫操作where一起使用 |
- $User = M("User"); // 實例化User對象
- $User->where('id=5')->setInc('score',3); // 用戶的積分加3
- $User->where('id=5')->setInc('score'); // 用戶的積分加1
- $User->where('id=5')->setDec('score',5); // 用戶的積分減5
- $User->where('id=5')->setDec('score'); // 用戶的積分減1
刪除(Delete)
在ThinkPHP中使用delete方法刪除數據庫中的記錄。用法 | delete($options=array()) |
參數 | options:爲數組的時候表示操作表達式,通常由連貫操作完成,如果沒有傳入任何刪除條件,則取當前數據對象的主鍵作爲條件;爲數字或者字符串的時候表示主鍵值。默認爲空數組。 |
回調接口 | 刪除成功後 _after_delete($data,$options) |
返回值 |
如果查詢錯誤返回false 如果刪除成功返回影響的記錄數 |
相關方法 | 通常配合連貫操作where、field、order等一起使用 |
- $User = M("User"); // 實例化User對象
- $User->where('id=5')->delete(); // 刪除id爲5的用戶數據
- $User->where('status=0')->delete(); // 刪除所有狀態爲0的用戶數據
- // 刪除所有狀態爲0的5 個用戶數據 按照創建時間排序
- $User->where('status=0')->order('create_time')->limit('5')->delete();