本文译自 Matt Stauffer 的系列文章.
之前完全忘了要把这个 Laravel 5 的系列博客写完,不过最近看到了一篇关于属性转换的简介 Laravel 5 Eloquent Attribute Casting is Awesome, 所以我决定把这个特性加到我的系列文章中。官方文档的 Eloquent 相关部分在这里。
什么是属性转换
转换一个属性值的意思是把它转换成某个特定的数据类型(或者是为了确保它是某个特定的数据类型)。数据类型我们都很熟悉了,比如 integer
或者 boolean
.
属性转换是 Eloquent 模型的一个功能特性,这个特性让我们可以赋予 Eloquent 模型中的某个属性转换为一个特定的数据类型。
提示:在以前版本中也可以这样做,但是必须为每个属性定义一个自动赋值的方法。而在新版本中可以通过单一的数组配置让模型自动完成这些工作。
这意味着假如你的数据是以特定的格式存储在数据库中,而你在使用时需要的是另外一种格式,现在你可以配置 Eloquent 模型自动完成两种格式之间的转换工作。
为什么要这样做?
最常见的应用场景可能是:当你存储数字的时候——它们默认是返回字符串,但 Eloquent 属性转换可以帮你把字符串转换为 integer
, real
, float
或者 double
,当然还可以转换为 boolean
.
但这就是全部了吗?当然不是。
它是如何实现的?
要应用属性转换这个功能,你需要在你的模型中添加一个 protected $casts
的数组变量。
<pre class="brush:php">
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'is_admin' => 'boolean',
];
如上面代码所示,数组中的每个元素以属性名为 key, 要转换的目标类型为 value. 这个数组变量 $casts
的作用就是告诉 Eloquent:“每次当我访问这个模型中的 is_admin
属性的时候,返回一个类型为 boolean
的值给我”。
转换类型
integer
(int
)
这会把你指定的属性值转换为整形,通过 return (int) $value
来实现。
float
(real
|double
)
Real, Float 和 Double 在 PHP 中是同一种类型。 PHP 的 (double)
和 (real)
类型转换都是 (float)
的别名。所以指定为这三种时,其实在代码中都是通过 return (float) $value
来实现的。
string
这个很简单,就是把你指定的属性值转为字符串返回,用的是 return (string) $value
.
boolean
(bool
)
这是把你指定的属性值转换为布尔值返回,用 return (bool) $value
实现,这意味着你要把你的数据存储为 0
和 1
.
object
对象和数组是最有意思的选项。都是用把序列化为 JSON 格式数组的数据转换(反序列化)并返回。如果指定为 object
, 那么是用 return json_decode($value)
实现的,返回一个 stdClass 类型的对象。
array
这个值是把 JSON 化的数组转换为 PHP 数组,用 return json_decode($value, true)
实现。
如果你需要看一下源代码,请点击这里。
写在最后
如你所见, Eloquent 属性转换功能把我们从大量不必要的重复逻辑中解放出来,并且默默地让我们更容易在数据库中存储 JSON 数据。真是好东西!