除了手動構造入庫的數據集以外,ThinkPHP 還提供了自動建立數據對象的 create() 方法。create() 方法將自動收集提交的表單數據並建立數據對象而無需人工干預,這在表單數據字段很是多的狀況下更具優點。javascript
將前文寫入表單數據的例子用 create() 來實現:php
public function insert2(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); if($Dao->create()){ $Dao->password = md5($_POST["password"]); $Dao->regdate = time(); if($lastInsId = $Dao->add()){ echo "插入數據 id 爲:$lastInsId"; } else { echo "數據寫入錯誤!"; } }else{ exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]'); } }
create() 建立數據對象後,將自動收集提交過來的表單數據。而表單數據可能須要通過必定加工(例如將密碼加密)才能寫入數據表,因此能夠對數據對象的成員屬性值根據進行修改或添加去除等。html
提示:create() 建立的數據對象存放於內存,在執行入庫動做(add() 或 save())以前,均可以進行修改。java
在上面的例子裏,create()方法 的行爲和 date()方法 是一致。但 date() 方法只是簡單的建立數據對象,但 create() 方法還具有:thinkphp
等各類高級的數據功能,要完成這些高級數據模型功能,須要使用 D方法 實例化數據模型。ThinkPHP 提供了各類驗證與填充規則供調用,具體可參見《ThinkPHP 自動驗證》與《ThinkPHP 自動填充》。ide
在將表單寫入數據表以前,經常會有一些對數據的檢測(提交的用戶名是否符合要求)與處理(如例子中的密碼加密以及取得當前時間戳)。create() 方法就支持數據的自動驗證與自動完成。ui
在 LibModel 目錄下建立 UserModel.class.php 文件(User 爲建立的模型對象,也對應 前綴_user 表),加入自動驗證和自動填充規則:加密
class UserModel extends Model{ // 自動驗證設置 protected $_validate = array( array('username','require','用戶名必須填寫!',1), array('email','email','郵箱格式錯誤!',2), array('username','','用戶名已經存在!',0,'unique',1), ); //自動填充設置 protected $_auto = array( array('regdate','time',self::MODEL_INSERT,'function'), array('password','md5',self::MODEL_INSERT,'function'), ); }
將 insert2 操做更改成:spa
public function insert2(){ header("Content-Type:text/html; charset=utf-8"); $Dao = D("User"); if($Dao->create()){ if($lastInsId = $Dao->add()){ echo "插入數據 id 爲:$lastInsId"; } else { echo "數據寫入錯誤!"; } }else{ exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]'); } }
若是提交的數據不符合驗證要求(如用戶名存在),則 create() 建立數據對象失敗(返回 FALSE ),$Dao->getError() 會打印出自動驗證設置規則裏面設置的提示信息:用戶名已經存在!htm
若是驗證規則經過後,系統會進行自動填充設置,將表單密碼進行 MD5 加密以及取得當前的時間戳填充入 create() 的數據對象。
因此 D方法 配合 create() 是很是智能而強大的,恰當運用能夠達到事半功倍快速開發的目的。