1. 程式人生 > >15、ThinkPhP5 :轉換與自動完成

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 陣列
json JSON型別
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'] = '[email protected]';
        $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 ('[email protected]' , 's:6:\"yefeng\";' , 1528732800) 
        $user = Users::get(43);
        echo $user->birthday.'<br>';
        echo $user->nickname;
資料庫中的記錄為:43	[email protected]				s:6:"yefeng";			1528732800	
結果為:
2018-06-12
yefeng

2、自動完成

在USERS模式中配置
        //自動完成 更新的時候 配合修改器使用  , 假如商城預設只賣女士用品,建立使用者的時候時候預設sex為0
        protected $insert = array(
            'sex' => 0,
        );

在index控制器中

        //自動完成,就是比如在向資料庫中插入資料的時候 你想要某個欄位自動完成插入。
        Users::create(['email' => '[email protected]']); //這樣他就會自動把sex 為0 插入進去。
        // INSERT INTO `tp_users` (`email` , `sex`) VALUES ('[email protected]' , 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