【ThinkPHP】ThinkPHP5 读取器、修改器、类型转换、自动完成

来源:我的博客站 OceanicKang |《【ThinkPHP】ThinkPHP5 读取器、修改器、类型转换、自动完成》

上一篇:《【ThinkPHP】ThinkPHP5 数据模型和关联》

读取器

命名规范:get + 属性名的驼峰命名 + Attr

程序在读取属性时,自动检测是否存在读取器方法

修改器(写入器)

命名规范:set + 属性名的驼峰命名 + Attr

自动类型转换

配置自动类型转换后,程序会在读取或者写入数据时,自动对数据进行类型转换

类型 描述
integer 整型
float 浮点型
array 数组
json JSON类型
object 对象
datetime 日期时间
timestamp 时间戳(整型)
serialize 序列化

自动完成

自动完成可以在插入或者更新数据时指定某个字段值

也可以结合修改器来指定自动完成

Index.php(控制器文件)


namespace app\index\controller;

use app\index\model\User;

class Index extends Controler {
	public function index {

		$user = User::get(1);

		/**** 读取器 ****/
		echo $user -> nickname . '
'
; // 自动检测 getNicknameAttr读取器方法 echo $user -> email . '
'
; // 自动检测 getEmailAttr读取器方法 echo $user -> reg_time . '
'
; // 自动检测 getRegTimeAttr读取器方法 // 数据库存储的reg_time为1507564800,经过getRegTimeAttr读取器方法修改以后输出结果为2017-10-10 // 若检测到读取器,输出经过读取器改变后的值。若无读取器,值原样返回。 /**** 修改器 ****/ $user -> reg_time = '2017-10-10'; //自动检测 setRegTimeAttr修改器方法 $user -> save(); /**** 自动类型转换 ****/ echo $user -> reg_time; $user -> nickname = ['aa' => 11]; // 数组['aa' => 11]序列化为字符串'a:1:{s:2:\"aa\";i:11;}' $user -> save(); print_r($user -> nickname); // 字符串'a:1:{s:2:\"aa\";i:11;}'反序列化为数组Array([aa] => 11) /**** 自动完成 ****/ User::create(['nackname'] => 'helloword'); // 插入一条新数据,自动完成 insert $user -> sex = 1; // 虽然赋值为1,但因为update自动完成,sex无法写死,值会根据sex修改器自动更改 } }

User.php(模型文件)


namespace app\index\model;

use think\Model;

class User extends Model {

	/**** 读取器 ****/

	// RegTime读取器
	protected function getRegTimeAttr($regtime) {

		return 'old time:'.date('Y-m-d', $regtime);  // 时间戳格式改为Y-m-d格式

	}

	// Email读取器
	protected function getEmailAttr($a, $user) {  // 第二个参数为整个数据对象,命名无要求

		return "your Email:$a, and your password:{$user['password']}";

	}

	/**** 修改器 ****/
	// RegTime修改器
	protected function setRegTimeAttr($regtime) {

		return strtotime($regtime);  //strtotime()函数将任何英文文本的日期或时间描述解析为 Unix 时间戳

	}

	/**** 自动类型转换 ****/
	protected $type = array(
					'reg_time' => 'timestamp:Y-m-d',
					// 告诉程序,reg_time是时间戳日期类型,并且指定转换格式为Y-m-d
					'nickname' => 'serialize',
					// 将变量序列化为可存储的字符串,例如数据库nickname字段是不能保存数组的,将数组序列化为字符串存入字段,读取的时候自动将字符串反序列化为数组
					);

	/**** 自动完成 ****/
	// 自动完成 insert(插入数据时) update(更新数据时) auto(insert和update时)
	protected $insert = array(
							'set_time' => time(),//插入数据时,自动添加set_time值为当前时间
						);

	// 自动完成 值不写死
	protected $update = array(
							'sex',//告诉系统sex字段自动完成,但值不写死
						);

	// sex修改器
	protected function setSexAttr($sex, $user) {

		return $user['head_pic'] == 'boy.jpg' ? 1 : 0;
		// head_pic字段的值若为boy.jpg则返回1,否则返回0

	}
}

用途

读取器

主要用于读取数据输出显示,如数据表地址字段为省、市、区存储为id格式,显示需要省市区标准的地址格式,可在读取器中先进行修改拼接,再返回输出。

修改器

主要用于更新数据、插入数据,如用户提交出生年月日格式为Y-m-d,数据表存储的是unix时间戳int格式,则需要在修改器中将时间数据格式修改后返回提交。

自动类型转换

主要用于数据类型转换,如时间格式、整型浮点数格式等。

自动完成

主要用于对一些用户不可输入的数据进行更改添加,如注册时间、修改日期、默认头像等。

你可能感兴趣的:(ThinkPHP)