详解thinkPHP5模型中的修改器和自动完成

发布时间 - 2021-02-11 00:00:00    点击率:

下面由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 = '这里是真实表中的更新时间字段';

 


# php  # thinkphp  # database  # 数据库  # 自动完成  # 修改器  # 更新时间  # 只在  # 器中  # 表单  # 是在  # 在每个  # 给大家  # 三种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速生成专业多端适配建站电话?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  MySQL查询结果复制到新表的方法(更新、插入)  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel Fortify是什么,和Jetstream有什么关系  微信小程序 canvas开发实例及注意事项  JS碰撞运动实现方法详解  JS中对数组元素进行增删改移的方法总结  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  黑客入侵网站服务器的常见手法有哪些?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  详解Android图表 MPAndroidChart折线图  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何快速上传自定义模板至建站之星?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  详解jQuery中的事件  Thinkphp 中 distinct 的用法解析  如何打造高效商业网站?建站目的决定转化率  怎么用AI帮你设计一套个性化的手机App图标?  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何在IIS7中新建站点?详细步骤解析  如何在云主机上快速搭建网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  微信公众帐号开发教程之图文消息全攻略  网易LOFTER官网链接 老福特网页版登录地址  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel distinct去重查询_Laravel Eloquent去重方法  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Python3.6正式版新特性预览  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何快速生成可下载的建站源码工具?  JavaScript如何实现路由_前端路由原理是什么  如何在建站主机中优化服务器配置?  如何在万网利用已有域名快速建站?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  EditPlus中的正则表达式实战(5)  详解vue.js组件化开发实践  如何快速搭建自助建站会员专属系统?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  微信小程序 scroll-view组件实现列表页实例代码  如何快速生成高效建站系统源代码?  Laravel如何创建自定义中间件?(Middleware代码示例)