ThinkPHP提供了靈活和方便的數據操作方法,對數據庫操作的四個基本操作(CURD):創建、更新、讀取和刪除的實現是最基本的,也是必須掌握的,在這基礎之上才能熟悉更多實用的數據操作方法。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);
或者使用data方法連貫操作
$User->data($data)->add();
如果在add之前已經創建數據對象的話(例如使用了create或者data方法),add方法就不需要再傳入數據了。
使用create方法的例子:
$User = M("User");//實例化User對象
// 根據表單提交的POST數據創建數據對象
$User->create();
$User->add(); // 根據條件保存修改的數據
如果你的主鍵是自動增長類型,並且如果插入數據成功的話,Add方法的返回值就是最新插入的主鍵值,可以直接獲取。
從2.1版開始恢復了批量插入數據的addAll方法(僅針對Mysql數據庫),如:
$User->addAll($data)
同時在數據插入時允許更新操作,add($data='',$options=array(),$replace=false)
其中Tadd方法增加$replace參數(是否添加數據時允許覆蓋),true表示覆蓋,默認爲false
二、讀取數據(Read)
在ThinkPHP中讀取數據的方式很多,通常分爲讀取數據和讀取數據集。
讀取數據集使用select方法(新版已經廢除原來的findall方法):
用法 |
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();
Select方法配合連貫操作方法可以完成複雜的數據查詢。而最複雜的連貫方法應該是where方法的使用,因爲這部分涉及的內容較多,我們會在查詢語言部分就如何進行組裝查詢條件進行詳細的使用說明。基本的查詢暫時不涉及關聯查詢部分,而是統一採用關聯模型來進行數據操作,這一部分請參考關聯模型部分。
讀取數據使用find方法:
用法 |
find($options=array()) |
參數 |
options(可選):爲數組的時候表示操作表達式,通常由連貫操作完成;爲數字或者字符串的時候表示主鍵值。默認爲空數組。 |
回調接口 |
查詢後 _after_find(&$result,$options) |
返回值 |
如果查詢錯誤返回false 如果查詢結果爲空返回null 如果查詢成功返回查詢的結果(索引數組) |
相關方法 |
通常配合連貫操作where、field、order、join等一起使用 |
讀取數據的操作其實和數據集的類似,select可用的所有連貫操作方法也都可以用於find方法,區別在於find方法最多隻會返回一條記錄,因此limit方法對於find查詢操作是無效的。
下面是一些查詢的例子:
$User = M("User");//實例化User對象
// 查找status值爲1name值爲think的用戶數據
$User->where('status=1 AND name="think"')->find();
即使滿足條件的數據不止一條,find方法也只會返回第一條記錄。
如果要讀取某個字段的值,可以使用getField方法,
用法 |
getField($field,$sepa=null) |
參數 |
field(必須):要獲取的字段字符串(多個用逗號分隔) sepa(可選):字段數據間隔符號,如果是 NULL返回數組爲數組。默認爲null。 |
回調接口 |
因爲調用了select所以同select回調接口 |
返回值 |
如果查詢結果爲空返回null 如果field是一個字段則返回該字段的值 如果field是多個字段,返回數組。數組的索引是第一個字段的值,sepa爲null則返回二維數組。 |
相關方法 |
通常配合連貫操作where、limit、order等一起使用 |
示例如下:
$User = M("User");//實例化User對象
// 獲取ID爲3的用戶的暱稱
$nickname = $User->where('id=3')->getField('nickname');
當只有一個字段的時候,始終返回一個值。
如果傳入多個字段的話,可以返回一個關聯數組:
$User = M("User");//實例化User對象
// 獲取所有用戶的ID和暱稱列表
$list = $User->getField('id,nickname');
返回的list是一個數組,鍵名是用戶的id, 鍵值是用戶的暱稱nickname。
三、更新數據(Update)
在ThinkPHP中使用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); // 根據條件保存修改的數據
爲了保證數據庫的安全,避免出錯更新整個數據表,如果沒有任何更新條件,數據對象本身也不包含主鍵字段的話,save方法不會更新任何數據庫的記錄。
因此下面的代碼不會更改數據庫的任何記錄
$User->save($data);
除非使用下面的方式:
$User = M("User");//實例化User對象
// 要修改的數據對象屬性賦值
$data['id'] = 5;
$data['name'] ='ThinkPHP';
$data['email'] ='[email protected]';
$User->save($data); // 根據條件保存修改的數據
如果id是數據表的主鍵的話,系統自動會把主鍵的值作爲更新條件來更新其他字段的值。
還有一種方法是通過create或者data方法創建要更新的數據對象,然後進行保存操作,這樣save方法的參數可以不需要傳入。
$User = M("User");//實例化User對象
// 要修改的數據對象屬性賦值
$data['name'] ='ThinkPHP';
$data['email'] ='[email protected]';
$User->where('id=5')->data($data)->save(); // 根據條件保存修改的數據
使用create方法的例子:
$User = M("User");//實例化User對象
// 根據表單提交的POST數據創建數據對象
$User->create();
$User->save(); // 根據條件保存修改的數據
上面的情況,表單中必須包含一個以主鍵爲名稱的隱藏域,才能完成保存操作。
如果只是更新個別字段的值,可以使用setField方法。
用法 |
setField($field,$value='') |
參數 |
field:要更新的字段名,如果是數組,則表示更新多個字段。 value:要更新的值,當field爲數組的時候value值無效。 |
返回值 |
如果查詢錯誤返回false 如果更新成功返回影響的記錄數 |
相關方法 |
必須配合連貫操作where一起使用 |
使用示例:
$User = M("User");//實例化User對象
// 更改用戶的name值
$User-> where('id=5')->setField('name','ThinkPHP');
setField方法支持同時更新多個字段,只需要傳入數組即可,例如:
$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 如果更新成功返回影響的記錄數 |
相關方法 |
必須配合連貫操作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的用戶數據
delete方法可以用於刪除單個或者多個數據,主要取決於刪除條件,也就是where方法的參數,也可以用order和limit方法來限制要刪除的個數,例如:
// 刪除所有狀態爲0的5 個用戶數據 按照創建時間排序
$User->where('status=0')->order('create_time')->limit('5')->delete();
關於自動驗證方面:
<?php
class FormModel extends Model {
// 自動驗證設置
/*
* 一:自動驗證
自動驗證的定義是這樣的:array(field,rule,message,condition,type,when,params)
field:代表是數據庫的字段名;
rule:代表是規則;
它的值要看type的類型而定;
如果是condition 是function(callback),rule是一個函數名
condition 是in,rule是一個數組
message:代表是消息提示;
condition:代表是驗證條件
它的值:
self::MUST_VALIDATE 表示必須驗證1
self::VALUE_VAILIDATE 表示不爲空的時候驗證2
self::EXISTS_VAILIDATE 表示表單存在的字段驗證(默認)0
type:代表驗證類型
它的值:
function(callback) 表示驗證的是調用一個Model中的函數
confirm 表示驗證兩個字段是否相同
in 是否在某個數組範圍之內
equal 驗證是否等於某個值
unique 驗證某個值是否唯一
regex 使用正則表達式(默認)
when:代表是是否需要執行驗證
它的值:
self::INSERT_STATUS add操作的時候驗證
self::UPDATE_STATUS update操作的時候驗證
self::ALL_STATUS (不用說了吧)
params:參數(具體什麼我現在還不太清楚)
* */
protected $_validate=
array(
array('title','require','標題必須!',1),//必須驗證
array('email','email','郵箱格式錯誤!',2),//不爲空時驗證
array('content','require','內容必須'),
array('title','','標題已經存在',0,'unique',self::MODEL_INSERT),
);
// 自動填充設置
//array(填充字段,填充內容,填充條件,附加規則)
/* 填充條件包括:
ADD 新增數據的時候處理(默認方式) self::MODEL_INSERT add操作的時候填充
Update 更新數據的時候處理 self::MODEL_UPDATE udate操作的時候填充
ALL 所有情況下都進行處理 self::MODEL_BOTH (不用說了)
附加規則包括:
function 使用函數
callback 回調方法
field 用其它字段填充
string 字符串(默認方式)
*/
protected $_auto=
array(
array('status','1',self::MODEL_INSERT),
array('create_time','time',self::MODEL_INSERT,'function'),
);
}
?>
關於模版頁面的輸出:
普通輸出
輸出模板中的變量,格式如下:
{$變量名稱}
例子:
{$username} //普通變量
{$userinfo["email"]} //數組方式
{$userinfo["sub"]["name"]} //三維數組方式
{$userinfo:email} //對象方式
{$userinfo.email} //自動判斷數組或對象方式
默認輸出
如果輸出的模板變量沒有值,但是我們需要在顯示的時候賦予一個默認值的話,可以使用 default 語法來默認顯示一個值。
格式:
{$變量|default="默認值"}
例子:
{$username|default="匿名"}
使用函數
對模板變量使用函數
模板引擎支持對輸出的變量做格式化處理,也就是使用函數,並且支持多個函數。
格式:
{$變量|函數1|...|函數n=參數1,...,參數n,### }
函數從左往右對變量執行,先執行函數1,得到結果後作爲參數再執行函數2,依次類推,並且默認情況下執行的結果是作爲下一個函數第一個參數。
例子:
{$webTitle|md5|strtoupper|substr=0,3}
實際執行結果等效爲:
<?php
echo substr(strtoupper(md5($webTitle)),0,3);
?>
如果變量或上函數執行的結果不是函數或下一個函數的第一個參數,那麼需要使用定位符“###”:
{$userinfo["regdate"]|date="Y-m-d H:i",###}
實際執行結果等效爲:
<?php
echo date("y-m-d H:i",$userinfo["regdate"]|);
?>
提示
對變量使用函數沒有數量限制,但默認禁用了 exit 和 echo 函數,以防止破壞模板輸出。關於禁用的函數具體配置可參見《ThinkPHP 系統配置》。
模板直接使用函數
模板文件中還支持直接調用函數的快捷方法,無需通過模板變量,包括兩種方式:
1、執行函數並輸出返回值
格式:
{:函數}
例子:
{:say_hello('ThinkPHP')} //say_hello()爲用戶自定義函數
實際執行結果等效爲:
<?php
echo say_hello('ThinkPHP');
?>
2、執行函數但不輸出
格式:
{~函數}
例子:
{~say_hello('ThinkPHP')} //say_hello()爲用戶自定義函數
實際執行結果等效爲:
<?php
say_hello('ThinkPHP');
?>
以上兩種方法,也支持傳入模板變量作爲函數的參數。
系統變量輸出
系統變量包括:server、session、post、get、request、cookie、env。系統變量的輸出不需要事先賦值給某個模板變量。系統變量的輸出以 $Think. 開頭,並且仍然支持使用函數。
例子:
{$Think.session.session_id|md5} //輸出
$_SESSION 變量並使用 md5 加密
//或簡寫爲
{$_SESSION. session_id|md5}
//輸出$_GET變量
{$_GET.pageNumber}
系統常量輸出
使用$Think.const輸出系統常量。
例子:
{$Think.const.ACTION_NAME} //輸出
ThinkPHP 系統定義的常量 ACTION_NAME(當前操作名稱)
//或簡寫爲
{$Think.ACTION_NAME}
配置參數輸出
使用 $Think.config 輸出項目的配置參數值。
例子:
{$Think.config.DB_PREFIX}
輸出的值和 C('DB_PREFIX') 的返回結果是一樣的。
快捷輸出
爲了使得模板定義更加簡潔,系統還支持一些常用的變量輸出快捷標籤,包括:
{@var} 與 {$Think.session.var} 等效,輸出 Session 變量
{#var} 與 {$Think.cookie.var} 等效,輸出 Cookie 變量
{&var} 與 {$Think.config.var} 等效,輸出配置參數
{%var} 與 {$Think.lang.var} 等效,輸出語言變量
{.var} 與 {$Think.get.var} 等效,輸出 GET 變量
{^var} 與 {$Think.post.var} 等效,輸出 POST 變量
{*var} 與 {$Think.const.var} 等效,輸出常量
提示
快捷輸出不支持函數的使用
爲了模板的可讀性較強,不建議使用快捷輸出方式