一 字段类型转换
支持给字段设置类型自动转换,会在写入和读取的时候自动进行处理,例如:
class User extends Model
{
protected $type = [
'status' => 'integer',
'score' => 'float',
'birthday' => 'datetime',
'info' => 'array',
'friend_list ' => 'json'
];
}
下面是一个类型自动转换的示例:
$user = new User;
$user->status = '1';
$user->score = '99.50';
$user->birthday = '2022/5/1';
$user->info = ['a'=>1,'b'=>2];
$user->friend_list = ['name'=>'小明','height'=> 155,'age'=> 12]; //数据库中形式 {"name": "小明", "card": "155", "age": "12"}
$user->save() ; //vardump($user->save()); int 1
var_dump($user->status); // int 1
var_dump($user->score); //float 99.5
var_dump($user->birthday); //string ‘2022-05-01 00:00:00’
var_dump($user->info); // array (size=2) ‘a’ => int 1 ‘b’ => int 2
var_dump($user->friend_list); // array (size=3) ‘name’ => string 小明 ‘height’ => int 155 ‘age’ => int 12
integer:设置为integer(整型)后,该字段写入和输出的时候都会自动转换为整型。
float该字段的值写入和输出的时候自动转换为浮点型。
boolean该字段的值写入和输出的时候自动转换为布尔型。
array如果设置为强制转换为array类型,系统会自动把数组编码为json格式字符串写入数据库,取出来的时候会自动解码。
object该字段的值在写入的时候会自动编码为json字符串,输出的时候会自动转换为stdclass对象。
serialize指定为序列化类型的话,数据会自动序列化写入,并且在读取的时候自动反序列化。
json指定为json类型的话,数据会自动json_encode写入,并且在读取的时候自动json_decode处理。
timestamp指定为时间戳字段类型的话,该字段的值在写入时候会自动使用strtotime生成对应的时间戳,输出的时候会自动转换为dateFormat属性定义的时间字符串格式,默认的格式为Y-m-d H:i:s,如果希望改变其他格式,可以定义如下:
class User extends Model
{
protected $dateFormat = 'Y/m/d';
protected $type = [
'status' => 'integer',
'score' => 'float',
'birthday' => 'timestamp',
'info' => 'array',
'friend_list ' => 'json'
];
}
//或者在类型转换定义的时候使用:
class User extends Model
{
protected $type = [
'status' => 'integer',
'score' => 'float',
'birthday' => 'timestamp:Y/m/d',
'info' => 'array',
'friend_list ' => 'json'
];
}
//然后就可以
$user = User::find(1);
echo $user->birthday; // 2022/5/1
datetime和timestamp类似,区别在于写入和读取数据的时候都会自动处理成时间字符串Y-m-d H:i:s的格式。
二 数据完成:
数据自动完成指在不需要手动赋值的情况下对字段的值进行处理后写入数据库。
系统支持auto、insert和update三个属性,可以分别在写入、新增和更新的时候进行字段的自动完成机制,auto属性自动完成包含新增和更新操作,例如我们定义User模型类如下:
class User extends Model
{
protected $auto = [];
protected $insert = ['ip','status' => 1]; //在新增数据的时候,会对ip和 status 字段自动完成或者处理。
protected $update = ['login_ip'];
//修改器
protected function setIpAttr()
{
return request()->ip();
}
}
在新增数据的时候,会对ip和 status 字段自动完成或者处理。
$user = new User;
$user->name = 'ThinkPHP';
$user->save();
echo $user->name; // ThinkPHP
echo $user->status; // 1
//在保存操作的时候,会自动完成ip字段的赋值。
$user = User::find(1);
$user->name = 'THINKPHP';
$user->save();
echo $user->name; // THINKPHP
echo $user->ip; // 127.0.0.1