1. 程式人生 > 其它 >[譯]Laravel 5.0 之 Eloquent 屬性轉換

[譯]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 實現,這意味著你要把你的資料儲存為 01.

object

物件和陣列是最有意思的選項。都是用把序列化為 JSON 格式陣列的資料轉換(反序列化)並返回。如果指定為 object, 那麼是用 return json_decode($value) 實現的,返回一個 stdClass 型別的物件。

array

這個值是把 JSON 化的陣列轉換為 PHP 陣列,用 return json_decode($value, true) 實現。

如果你需要看一下原始碼,請點選這裡

寫在最後

如你所見, Eloquent 屬性轉換功能把我們從大量不必要的重複邏輯中解放出來,並且默默地讓我們更容易在資料庫中儲存 JSON 資料。真是好東西!