下面由thinkphp教學欄位介紹thinkPHP5模型中的修改器和自動完成,希望對需要的朋友有幫助!
一、修改器
實際開發過程中,某些欄位儲存到表格中時需要做些修改,例如使用者註冊時填寫的密碼在表中儲存時需要加密,修改器因此產生。
修改器同獲取器類似,需要寫在模型中,其命名規則為set 字段名(按駝峰法) Attr。
實例:新增使用者時,使用者的密碼需要加密
建立使用者表
CREATE TABLE `tp_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(60) NOT NULL DEFAULT '', `password` char(32) NOT NULL DEFAULT '', `mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '用户手机号', `email` varchar(100) NOT NULL DEFAULT '', `sex` tinyint(3) NOT NULL DEFAULT '0' COMMENT '性别 0未知 1男 2女', `age` tinyint(3) unsigned NOT NULL DEFAULT '0', `time` int(10) NOT NULL DEFAULT '0' COMMENT '时间', `create_time` int(10) NOT NULL DEFAULT '0' COMMENT '创建时间', `update_time` int(10) NOT NULL DEFAULT '0' COMMENT '更新时间', `status` tinyint(3) NOT NULL DEFAULT '1' COMMENT '记录状态 -1删除 0禁用 1正常', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
模型中新增密碼修改器:
namespace app\index\model; use think\Model; class User extends Model{ //密码的修改器 public function setPasswordAttr($val){ //此处做一些对用户传入值的处理 return md5($val); } }
控制器中新增使用者資料:
namespace app\index\controller; use think\Controller; use app\index\model\User; class Index extends Controller{ public function index(){ //模拟传入的post表单数据 $data = [ 'username' => 'Emrys', 'password' => 'emrys', 'email' => 'emrys126.com', 'mobile' => '13955555555', 'sex' => 1, 'age' => 18 ]; //添加用户数据 $res = User::create($data); dump($res); } }
運行後資料庫多了記錄,密碼欄位是經過密碼修改器改變後的值。
二、自動完成
實際開發中建立的表格字段基本上存在需要自動完成的字段,如記錄創建時間、更新時間、創建人id(登入使用者的id)等,這時就需要用到表的自動完成功能。自動完成包括插入和更新時都自動完成、插入時自動完成、更新時自動完成三種,其設定是在模型中使用
//插入和更新时均自动完成的字段 protected $auto = []; //只在插入时自动完成的字段 protected $insert = []; //只在更新时自动完成的字段 protected $update = [];
現設定time欄位在插入和更新時均自動完成、 create_time欄位在插入時自動完成、update_time欄位在更新時自動完成。自動完成設定如下,
namespace app\index\model; use think\Model; class User extends Model{ //自动完成,插入和更新时都自动执行 protected $auto = [ 'time' ]; //只在插入时完成 protected $insert = [ 'create_time' ]; //只在数据更新时完成 protected $update = [ 'update_time' ]; //获取器 public function getSexAttr($val){ switch ($val) { case '1': return '男'; break; case '2': return '女'; break; default: return '保密'; break; } } //密码的修改器 public function setPasswordAttr($val){ return md5($val); } //时间修改器 public function setTimeAttr(){ return time(); } //创建时间修改器 public function setCreateTimeAttr(){ return time(); } //更新时间修改器 public function setUpdateTimeAttr(){ return time(); } }
控制器中新增資料、更新資料完成測試,
namespace app\index\controller; use think\Controller; use app\index\model\User; class Index extends Controller{ public function index(){ //模拟传入的post表单数据 $data = [ 'username' => 'Emrys', 'password' => 'emrys', 'email' => 'emrys126.com', 'mobile' => '13955555555', 'sex' => 1, 'age' => 18 ]; //添加用户数据 $res = User::create($data); dump($res); } }
執行上述新增資料程式碼的time、create_time、update_time三欄位的執行結果如下圖所示,新增資料時time和create_time欄位都會插入目前時間,update_time是預設值0.
控制器中更新資料的程式碼:
namespace app\index\controller; use think\Controller; use app\index\model\User; class Index extends Controller{ public function index(){ //更新数据 $user = User::get(12); $user->age = 120; $res = $user->save(); dump($res); } }
執行上方的更新資料代碼後,update_time欄位加入了目前時間,time欄位的值也更新為目前時間,create_time的值未改變。
使用修改器的方式實現自動完成功能需要在每個模型中新增各字段的修改器,這樣造成程式碼臃腫。 tp5為此有專門的配置,在資料庫連線設定檔database.php中的auto_timestamp = false項,改為true,即可在每個表中進行create_time、update_time的自動完成。由於不是每個表中一定存在create_time和update_time字段,因此tp5也提供了在模型中配置的方法。
//开启自动写入时间戳 protected $autoWriteTimestamp = true; //默认的时间戳是create_time和update_time,可通过如下进行修改。如果不想在插入或更新数据时添加该字段的值,则设置为false protected $createTime = false; protected $updateTime = '这里是真实表中的更新时间字段';
以上是詳解thinkPHP5模型中的修改器與自動完成的詳細內容。更多資訊請關注PHP中文網其他相關文章!