標籤:usermod val color sql pac std creat 擷取資料 表單提交
ThinkPHP提供了靈活和方便的資料操作方法,對資料庫操作的四個基本操作(CURD):建立、更新、讀取和刪除的實現是最基本的,也是必須掌握的,在這基礎之上才能熟悉更多實用的資料操作方法。
CURD操作通常是可以和連貫操作配合完成的。
資料建立
在進行資料操作之前,我們往往需要手動建立需要的資料,例如對於提交的表單資料:
// 擷取表單的POST資料 $data[‘name‘] = $_POST[‘name‘]; $data[‘email‘] = $_POST[‘email‘]; // 更多的表單資料值擷取 //……
建立資料對象
ThinkPHP可以協助你快速地建立資料對象,最典型的應用就是自動根據表單資料建立資料對象,這個優勢在一個資料表的欄位非常之多的情況下尤其明顯。
很簡單的例子:
// 執行個體化User模型$User = M(‘User‘);// 根據表單提交的POST資料建立資料對象$User->create();
Create方法支援從其它方式建立資料對象,例如,從其它的資料對象,或者數組等
$data[‘name‘] = ‘ThinkPHP‘;$data[‘email‘] = ‘[email protected]‘;$User->create($data);
甚至還可以支援從對象建立新的資料對象
// 從User資料對象建立新的Member資料對象$User = stdClass();$User->name = ‘ThinkPHP‘;$User->email = ‘[email protected]‘;$Member = M("Member");$Member->create($User);
建立完成的資料可以直接讀取和修改,例如:
$data[‘name‘] = ‘ThinkPHP‘;$data[‘email‘] = ‘[email protected]‘;$User->create($data);// 建立完成資料對象後可以直接讀取資料echo $User->name;echo $User->email;// 也可以直接修改建立完成的資料$User->name = ‘onethink‘; // 修改name欄位資料$User->status = 1; // 增加新的欄位資料
資料操作狀態
create方法的第二個參數可以指定建立資料的操作狀態,預設情況下是自動判斷是寫入還是更新操作。
也可以顯式指定操作狀態,例如:
$Member = M("User");// 指定更新資料操作狀態$Member->create($_POST,Model::MODEL_UPDATE);
系統內建的資料操作包括Model::MODEL_INSERT(或者1)和Model::MODEL_UPDATE(或者2),當沒有指定的時候,系統根據資料來源是否包含主鍵資料來自動判斷,如果存在主鍵資料,就當成Model::MODEL_UPDATE操作。
不同的資料操作狀態可以定義不同的資料驗證和自動完成機制,所以,你可以自訂自己需要的資料操作狀態,例如,可以設定登入操作的資料狀態(假設為3):
$Member = M("User");// 指定更新資料操作狀態$Member->create($_POST,3);
事實上,create方法所做的工作遠非這麼簡單,在建立資料對象的同時,完成了一系列的工作,我們來看下create方法的工作流程就能明白:
| 步驟 |
說明 |
返回 |
| 1 |
擷取資料來源(預設是POST數組) |
|
| 2 |
驗證資料來源合法性(非數組或者對象會過濾) |
失敗則返回false |
| 3 |
檢查欄位對應 |
|
| 4 |
判斷資料狀態(新增或者編輯,指定或者自動判斷) |
|
| 5 |
資料自動驗證 |
失敗則返回false |
| 6 |
表單令牌驗證 |
失敗則返回false |
| 7 |
表單資料賦值(過濾非法欄位和字串處理) |
|
| 8 |
資料自動完成 |
|
| 9 |
產生資料對象(儲存在記憶體) |
|
因此,我們熟悉的令牌驗證、自動驗證和自動完成功能,其實都必須通過create方法才會生效。
如果沒有定義自動驗證的話,create方法的傳回值是建立完成的資料對象數組,例如:
$data[‘name‘] = ‘thinkphp‘;$data[‘email‘] = ‘[email protected]‘;$data[‘status‘] = 1;$User = M(‘User‘);$data = $User->create($data);dump($data);
輸出結果為:
array (size=3) ‘name‘ => string ‘thinkphp‘ (length=8) ‘email‘ => string ‘[email protected]‘ (length=18) ‘status‘=> int 1
Create方法建立的資料對象是儲存在記憶體中,並沒有實際寫入到資料庫中,直到使用add或者save方法才會真正寫入資料庫。
因此在沒有調用add或者save方法之前,我們都可以改變create方法建立的資料對象,例如:
$User = M(‘User‘);$User->create(); //建立User資料對象$User->status = 1; // 設定預設的使用者狀態$User->create_time = time(); // 設定使用者的建立時間$User->add(); // 把使用者物件寫入資料庫
如果只是想簡單建立一個資料對象,並不需要完成一些額外的功能的話,可以使用data方法簡單的建立資料對象。 使用如下:
// 執行個體化User模型$User = M(‘User‘);// 建立資料後寫入到資料庫$data[‘name‘] = ‘ThinkPHP‘;$data[‘email‘] = ‘[email protected]‘;$User->data($data)->add();
Data方法也支援傳入數組和對象,使用data方法建立的資料對象不會進行自動驗證和過濾操作,請自行處理。但在進行add或者save操作的時候,資料表中不存在的欄位以及非法的資料類型(例如對象、數組等非標量資料)是會自動過濾的,不用擔心非資料表欄位的寫入導致SQL錯誤的問題。
支援的連貫操作
create方法支援的連貫操作方法包括:
| 連貫操作 |
作用 |
支援的參數類型 |
| field |
用於定義合法的欄位 |
字串和數組 |
| validate |
用於資料自動驗證 |
數組 |
| auto |
用於資料自動完成 |
數組 |
| token |
用於令牌驗證 |
布爾值 |
欄位合法性過濾
如果在create方法之前調用field方法,則表示只允許建立指定的欄位資料,其他非法欄位將會被過濾,例如:
$data[‘name‘] = ‘thinkphp‘;$data[‘email‘] = ‘[email protected]‘;$data[‘status‘] = 1;$data[‘test‘] = ‘test‘;$User = M(‘User‘);$data = $User->field(‘name,email‘)->create($data);dump($data);
輸出結果為:
array (size=2) ‘name‘ => string ‘thinkphp‘ (length=8) ‘email‘ => string ‘[email protected]‘ (length=18)
最終只有name和email欄位的資料被允許寫入,status和test欄位直接被過濾了,哪怕status也是資料表中的合法欄位。
如果我們有自訂模型類,對於資料新增和編輯操作的話,我們還可以直接在模型類裡面通過設定insertFields和updateFields屬性來定義允許的欄位,例如:
namespace Home\Model;use Think\Model;class UserModel extends Model{ protected $insertFields = ‘name,email‘; // 新增資料的時候允許寫入name和email欄位 protected $updateFields = ‘email‘; // 編輯資料的時候只允許寫入email欄位}
ThinkPHP3.2基礎教程(19)--模型-CURD操作-資料建立