[譯]Laravel 5.0 之 Eloquent 屬性轉換
本文譯自 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
/**
* 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 資料。真是好東西!