15、ThinkPhP5 :轉換與自動完成
阿新 • • 發佈:2018-12-20
型別轉換 對於前面的時間戳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