修改器
存取器& 修改器
# 定義一個存取器
若要定義一個存取器,則需要在模型上建立一個getFooAttribute
方法,要存取的Foo
欄位需使用「駝峰式」命名。在這個範例中,我們將為 first_name
屬性定義一個存取器。當Eloquent 嘗試取得first_name
屬性時,將自動呼叫此存取器:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 获取用户的姓名. * * @param string $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); } }
如你所見,欄位的原始值會被傳遞到存取器中,讓你對它進行處理並回傳結果。如果想要取得被修改後的值,你可以在模型實例上存取first_name
屬性:
$user = App\User::find(1); $firstName = $user->first_name;
當然,你也可以透過現有的屬性值,使用存取器傳回新的計算值:
/** * 获取用户的姓名. * * @return string */ public function getFullNameAttribute(){ return "{$this->first_name} {$this->last_name}"; }
{tip} 如果你需要將這些運算值加入模型的陣列/ JSON 中, 你需要追加它們.
定義一個修改器
若要定義一個修改器,則需要在模型上面定義setFooAttribute
方法。要存取的 Foo
欄位使用「駝峰式」命名。讓我們再來定義一個 first_name
屬性的修改器。當我們嘗試在模式上在設定first_name
屬性值時,修改器將被自動呼叫:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 设置用户的姓名. * * @param string $value * @return void */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); } }
修改器會取得屬性已經被設定的值,允許你修改並且將其值設定到Eloquent 模型內部的$attributes
屬性上。舉個例子,如果我們嘗試將first_name
屬性的值設為 Sally
:
$user = App\User::find(1); $user->first_name = 'Sally';
在這個例子中,setFirstNameAttribute
方法在呼叫的時候接受Sally
這個值當參數。接著修改器會套用 strtolower
函數並將處理的結果設定到內部的 $attributes
陣列。
日期轉換器
預設情況下,Eloquent 會將created_at
和updated_at
欄位轉換為Carbon 實例,它繼承了PHP原生的DateTime
類別並提供了各種有用的方法。你可以透過設定模型的$dates
屬性來新增其他日期屬性:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 应该转换为日期格式的属性. * * @var array */ protected $dates = [ 'seen_at', ]; }
{tip} 你可以透過將模型的公有屬性
$timestamps
值設定為false
來停用預設的created_at
和updated_at
時間戳記。
當某個欄位是日期格式時,你可以將值設定為一個UNIX 時間戳,日期時間(Y-m-d
) 字串,或DateTime
/ Carbon
實例。日期值會被正確格式化並儲存到你的資料庫中:
$user = App\User::find(1); $user->deleted_at = now(); $user->save();
就如上面所說,當取得到的屬性包含在$dates
屬性中時,都會自動轉換為Carbon 實例,允許你在屬性上使用任意的Carbon 方法:
$user = App\User::find(1); return $user->deleted_at->getTimestamp();
日期格式
預設情況下,時間戳都會以'Y-m-d H:i:s'
形式格式化。如果你需要自訂時間戳格式,可在模型中設定 $dateFormat
屬性。這個屬性決定了日期屬性將以何種形式保存在資料庫中,以及當模型序列化成數組或JSON 時的格式:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ /** * 模型日期字段的保存格式. * * @var string */ protected $dateFormat = 'U'; }##屬性類型轉換模型中的
$casts 屬性提供了一個便利的方法來將屬性轉換為常見的資料類型。
$casts 屬性應為數組,且陣列的鍵是那些需要被轉換的屬性名稱,值則是你希望轉換的資料型別。支援轉換的資料型別有:
integer,
real#,
float,
double,
decimal:<digits>,
string,
boolean,
object,
array,
collection,
date,
datetime, 和
timestamp。當需要轉換為
decimal 類型時,你需要定義小數位的數,如:
decimal:2
0 或
1 )形式儲存在資料庫中的
is_admin 屬性轉成布林值。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 这个属性应该被转换为原生类型. * * @var array */ protected $casts = [ 'is_admin' => 'boolean', ]; }現在當你存取
is_admin 屬性時,雖然儲存在資料庫裡的值是一個整數類型,但是傳回值總是會被轉換成布林值類型:
$user = App\User::find(1); if ($user->is_admin) { // }
陣列 & JSON 轉換
當你在資料庫儲存序列化的 JSON 的資料時,array
類型的轉換非常有用。例如:如果你的資料庫具有被序列化為JSON 的JSON
或TEXT
欄位類型,並且在Eloquent 模型中加入了array
類型轉換,那麼當你造訪的時候就會自動轉換為PHP 陣列。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 这个属性应该被转换为原生类型. * * @var array */ protected $casts = [ 'options' => 'array', ]; }
一旦定義了轉換,你訪問 options
屬性時他會自動從 JSON 類型反序列化為 PHP 陣列。當你設定了options
屬性的值時,給定的陣列也會自動序列化為JSON 類型儲存:
$user = App\User::find(1); $options = $user->options; $options['key'] = 'value'; $user->options = $options; $user->save();
/** * 这个属性应该被转化为原生类型. * * @var array */ protected $casts = [ 'created_at' => 'datetime:Y-m-d', ];###這篇文章首發在 ###LearnKu.com### 網站上。 ######