ThinkPHP3.2基礎教程(19)--模型-CURD操作-資料建立

來源:互聯網
上載者:User

標籤: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操作-資料建立

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.