15、ThinkPhP5 :转换与自动完成

 类型转换
对于前面的时间戳birthday的例子,还可以进行进一步的简化,这里需要用到类型强制转换的功能,在User模型类中添加定义:

 <?php
 namespace app\index\model;

 use think\Model;

 class User extends Model
 {
     protected $dateFormat = 'Y/m/d';
     protected $type       = [
         // 设置birthday为时间戳类型(整型)
         'birthday' => 'timestamp',
     ];

 }

不需要定义任何修改器和读取器,我们完成了相同的功能。

对于timestamp和datetime类型,如果不设置模型的dateFormat属性,默认的日期显示格式为:Y-m-d H:i:s,或者也可以显示的设置日期格式,例如:

<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
    protected $type       = [
        // 设置birthday为时间戳类型(整型)
        'birthday' => 'timestamp:Y/m/d',
    ];
}

提示:
对于简单的数据格式转换之类的处理,设置类型转换比定义修改器和读取器更加方便。

ThinkPHP5.0支持的转换类型包括:

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

 自动完成
系统已经自动写入了think_user数据表中的的create_time、update_time字段,如果我们希望自动写入其它的字段,则可以使用自动完成功能,例如下面实现新增的时候自动写入status字段。

<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
    // 定义类型转换
    protected $type = [
        'birthday'    => 'timestamp:Y/m/d',
    ];
    // 定义自动完成的属性
    protected $insert = ['status' => 1];

}

除了insert属性之外,自动完成共有三个属性定义,分别是:

属性描述
auto新增及更新的时候自动完成的属性数组
insert仅新增的时候自动完成的属性数组
update仅更新的时候自动完成的属性数组

1、类型转换

在users模式中添一个

        //类型转换 就可以代替读取器和写入器
        protected  $type = array(
            
            'birthday' =>'timestamp:Y-m-d', //输出birthday 就应该为:2018-11-07 
            'nickname' =>'serialize', //昵称序列化
        );

在控制器中

        //类型转换
        $user = Users::get(1);
        echo $user->birthday.'<br>';
结果为:
2018-09-10
        $data['email'] = '2153434@qq.com';
        $data['nickname'] = 'yefeng'; //这个nickname也会被序列化 也可以定议成一个数组 [aa=>'11']
        $data['birthday'] = '2018-06-12'; //会被自动转换成时间戳
        
        
        $user = new Users();
        $result = $user->save($data);
        //INSERT INTO `tp_users` (`email` , `nickname` , `birthday`) VALUES ('2153434@qq.com' , 's:6:\"yefeng\";' , 1528732800) 
        $user = Users::get(43);
        echo $user->birthday.'<br>';
        echo $user->nickname;
数据库中的记录为:43	2153434@qq.com				s:6:"yefeng";			1528732800	
结果为:
2018-06-12
yefeng

2、自动完成

在USERS模式中配置
        //自动完成 更新的时候 配合修改器使用  , 假如商城默认只卖女士用品,创建用户的时候时候默认sex为0
        protected $insert = array(
            'sex' => 0,
        );

在index控制器中

        //自动完成,就是比如在向数据库中插入数据的时候 你想要某个字段自动完成插入。
        Users::create(['email' => '124455@qq.com']); //这样他就会自动把sex 为0 插入进去。
        // INSERT INTO `tp_users` (`email` , `sex`) VALUES ('124455@qq.com' , 0)

自动完成 有三种insert(插入时) update(更新时) auto (是插入和更新时都启用)

3、自动完成与修改器配合使用

         //类型转换 就可以代替读取器 写入器
        protected  $type = array(
            
            'birthday' =>'timestamp:Y-m-d', //输出birthday 就应该为:2018-11-07 
            'nickname' =>'serialize', //昵称序列化
        );        
         //根据头像来判断 如果是boy 就是1否刚就是0 这个时候只需要告诉系统那些字段需要自动更新 再配合修改器一起使用setSexAttr
        protected $update = array( //更新时执行
            'sex',
        );
        protected function setSexAttr($value,$data){ //根据头像来判断 如果是
        
            return $data['head_pic'] == 'boy.jp'?1:0;
        
        } 
       //自动完成与修改器配合使用
       $user = Users::get(1);
       $user->sex = 0;
       $user->birthday = '2018-12-01';
       $user->save();
       //UPDATE `tp_users` SET `sex`=0 WHERE `user_id` = 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值