第八天:(3)读取器和修改器【模型和关联】

第八天:(3)读取器和修改器【模型和关联】

读取器

前面读取用户生日的时候,使用了date方法进行日期的格式处理输出,但是每次读取数据后都需要这样处理就显得非常麻烦。

使用读取器功能就可以简化类似的数据处理操作,例如,我们给User模型添加读取器的定义方法。

<?phpnamespace app\index\model;use think\Model;class User extends Model{    // birthday读取器
    protected function getBirthdayAttr($birthday)
    {        return date('Y-m-d', $birthday);
    }
}

这里,我们添加了一个getBirthdayAttr读取器方法用于读取User模型的birthday属性的值,该方法会在读取birthday属性值的时候自动执行。

读取器方法的命名规范是:

get + 属性名的驼峰命名+ Attr

所以,getBirthdayAttr读取器读取的是birthday属性,而getUserBirthdayAttr 读取器读取的则是user_birthday属性。

定义完修改器后,修改控制器的read操作方法如下:

// 读取用户数据public function read($id=''){    $user = UserModel::get($id);    echo $user->nickname . '<br/>';    echo $user->email . '<br/>';    echo $user->birthday . '<br/>';
}

访问URL地址

http://tp5.com/user/1

最后的输出结果为:

流年
thinkphp@qq.com1977-03-05

读取器还可以定义读取数据表中不存在的属性,例如把原始生日和转换的格式分开两个属性birthdayuser_birthday,我们只需定义user_birthday属性的读取器方法:

<?phpnamespace app\index\model;use think\Model;class User extends Model{    // user_birthday读取器
    protected function getUserBirthdayAttr($value,$data)
    {        return date('Y-m-d', $data['birthday']);
    }
}

这里的读取器方法使用了第二个参数,表示传入所有的属性数据。因为原始的user_birthday属性数据是不存在的,所以我们需要通过data参数获取。

read操作方法修改为:

// 读取用户数据public function read($id=''){    $user = UserModel::get($id);    echo $user->nickname . '<br/>';    echo $user->email . '<br/>';    echo $user->birthday . '<br/>';    echo $user->user_birthday . '<br/>';
}

当刷新页面的时候,最终输出的结果为:

流年
thinkphp@qq.com2263392001977-03-05

修改器

由于birthday属性是时间戳(整型)格式的,因此我们必须在写入数据前进行时间戳转换,前面使用的方法是每次赋值的时候进行转换处理:

$user['birthday'] = strtotime('2015-04-02');

为了避免每次都进行日期格式的转换操作,可以定义修改器方法来自动处理,修改User模型如下:

<?phpnamespace app\index\model;use think\Model;class User extends Model{    // 读取器
    protected function getUserBirthdayAttr($birthday, $data)
    {        return date('Y-m-d', $data['birthday']);
    }    // birthday修改器
    protected function setBirthdayAttr($value)
    {        return strtotime($value);
    }
}

修改器方法的命名规范是:

set + 属性名的驼峰命名+ Attr

所以,setBirthdayAttr方法修改的是birthday属性,而setUserBirthdayAttr 方法修改的则是user_birthday属性。

控制器的add操作方法修改如下:

// 新增用户数据public function add(){    $user           = new UserModel;    $user->nickname = '流年';    $user->email    = 'thinkphp@qq.com';    $user->birthday = '1977-03-05';    if ($user->save()) {        return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
    } else {        return $user->getError();
    }
}

访问URL地址:

http://tp5.com/user/add

最后的输出结果为:

用户[ 流年:10 ]新增成功

接着我们访问

http://tp5.com/user/10

页面输出结果为:

流年
thinkphp@qq.com1977-03-05

通过定义修改器和读取器,完成了时间戳方式存储的birthday属性的写入和读取的自动处理。



回复列表



回复操作

正在加载验证码......

请先拖动验证码到相应位置