laravel 5 中Eloquent的属性类型转换真是太棒了!
属性类型转换是Laravel中Eloquent模型的一个最近添加的新属性,现在暂时没有获得太多关注。那么它是什么,有时怎么使用的呢?
类型转换指的是隐式或者显式的将实体从一种数据类型转为另外一种数据类型。这是一个值为"100"的变量从字符串转换为整形的例子:
$value = "100"; // $value是一个字符串
$value = (int) "100"; // $value转换为一个整形
在Laravel 4中,你只能手动地添加访问方法和/或调整方法处理属性以实现变量类型转换
public function getAgeAttribute($value)
{
return (int) $value;
}
但不在需要这样了!Laravel 5新添加的属性转化功能能让这些变得更为容易些。在模型类文件中的$casts
属性里,写上那些需要转换的属性及其对应目标类型:
protected $casts = [
'age' => 'integer'
];
这样,无论你什么时候使用这个age
属性,它都会被Eloquent转换为整形integer
var_dump($user->age); // int(25)得到整形的25`
对于我个人而言,正将在处理布尔型boolen
变量的时候特别有用。布尔型变量通常在数据库中存成TINYINT
类型,而当Eloquent从数据库生成这个模型时,布尔型变量将变成"1"或者"0"的字符串返回。“幸运”的是PHP能做出判断并将这些字符串隐式转换为对应的布尔型,但如果在通过JSON将模型传参给javascript,那么就糟糕了:
user = {
"id": "1",
"username": "jens",
"activated": "0" // 布尔型的false变为了字符串的"0"
};
user.activated ? "yes" : "no"; // will output "yes" 判断用户是否启用时变为相反的"yes"
而通过Laravel 5中的属性类型转换,将activated放进模型$casts中,它的值将自动转换为布尔型,不会再在javascript中造成问题
{
"id": "1",
"username": "jens",
"activated": true
}