【ThinkPHP】ThinkPHP5 读取器、修改器、类型转换、自动完成
in PHP with 0 comment, Views is 66

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

in PHP with 0 comment, Views is 66

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

读取器

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

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

修改器(写入器)

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

自动类型转换

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

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

自动完成

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

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

Index.php(控制器文件)

<?php
namespace app\index\controller;

use app\index\model\User;

class Index extends Controler {
    public function index {

        $user = User::get(1);

        /**** 读取器 ****/
        echo $user -> nickname . '<br />';  // 自动检测 getNicknameAttr读取器方法

        echo $user -> email . '<br />';     // 自动检测 getEmailAttr读取器方法

        echo $user -> reg_time . '<br />';  // 自动检测 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(模型文件)

<?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格式,则需要在修改器中将时间数据格式修改后返回提交。

自动类型转换

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

自动完成

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

Responses
选择表情