修改器
修改器
Eloquent: 修改器
簡介
當你在 Eloquent 模型實例中獲取或設置某些屬性值的時候,訪問器和修改器允許你對 Eloquent 屬性值進行格式化。例如,你可能需要使用 Laravel 加密器 來加密保存在數(shù)據(jù)庫中的值,而在使用 Eloquent 模型訪問該屬性的時候自動進行解密其值。
除了自定義訪問器和修改器外,Eloquent 也會自動將日期字段類型轉(zhuǎn)換為 Carbon 實例,或?qū)?文本類型轉(zhuǎn)換為 JSON。
訪問器 & 修改器
定義一個訪問器
若要定義一個訪問器, 則需在模型上創(chuàng)建一個 getFooAttribute
方法,要訪問的 Foo
字段需使用「駝峰式」命名。 在這個示例中,我們將為 first_name
屬性定義一個訪問器。當 Eloquent 嘗試獲取 first_name
屬性時,將自動調(diào)用此訪問器:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 獲取用戶的姓名. * * @param string $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); } }
如你所見,字段的原始值被傳遞到訪問器中,允許你對它進行處理并返回結(jié)果。如果想獲取被修改后的值,你可以在模型實例上訪問 first_name
屬性:
$user = App\User::find(1); $firstName = $user->first_name;
當然,你也可以通過已有的屬性值,使用訪問器返回新的計算值:
/** * 獲取用戶的姓名. * * @return string */ public function getFullNameAttribute(){ return "{$this->first_name} {$this->last_name}"; }
{tip} 如果你需要將這些計算值添加到模型的數(shù)組 / JSON 中, 你需要追加它們.
定義一個修改器
若要定義一個修改器,則需在模型上面定義 setFooAttribute
方法。要訪問的 Foo
字段使用「駝峰式」命名。讓我們再來定義一個 first_name
屬性的修改器。當我們嘗試在模式上在設置 first_name
屬性值時,該修改器將被自動調(diào)用:
<?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); } }
修改器會獲取屬性已經(jīng)被設置的值,允許你修改并且將其值設置到 Eloquent 模型內(nèi)部的 $attributes
屬性上。舉個例子,如果我們嘗試將 first_name
屬性的值設置為 Sally
:
$user = App\User::find(1); $user->first_name = 'Sally';
在這個例子中, setFirstNameAttribute
方法在調(diào)用的時候接受 Sally
這個值作為參數(shù)。接著修改器會應用 strtolower
函數(shù)并將處理的結(jié)果設置到內(nèi)部的 $attributes
數(shù)組。
日期轉(zhuǎn)換器
默認情況下,Eloquent 會將 created_at
和 updated_at
字段轉(zhuǎn)換為 Carbon 實例,它繼承了 PHP 原生的 DateTime
類并提供了各種有用的方法。你可以通過設置模型的 $dates
屬性來添加其他日期屬性:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 應該轉(zhuǎn)換為日期格式的屬性. * * @var array */ protected $dates = [ 'seen_at', ]; }
{tip} 你可以通過將模型的公有屬性
$timestamps
值設置為false
來禁用默認的created_at
和updated_at
時間戳。
當某個字段是日期格式時,你可以將值設置為一個 UNIX 時間戳,日期時間 (Y-m-d
) 字符串,或者 DateTime
/ Carbon
實例。日期值會被正確格式化并保存到你的數(shù)據(jù)庫中:
$user = App\User::find(1); $user->deleted_at = now(); $user->save();
就如上面所說,當獲取到的屬性包含在 $dates
屬性中時,都會自動轉(zhuǎn)換為 Carbon 實例,允許你在屬性上使用任意的 Carbon 方法:
$user = App\User::find(1); return $user->deleted_at->getTimestamp();
日期格式
默認情況下,時間戳都將以 'Y-m-d H:i:s'
形式格式化。如果你需要自定義時間戳格式,可在模型中設置 $dateFormat
屬性。這個屬性決定了日期屬性將以何種形式保存在數(shù)據(jù)庫中,以及當模型序列化成數(shù)組或 JSON 時的格式:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ /** * 模型日期字段的保存格式. * * @var string */ protected $dateFormat = 'U'; }
屬性類型轉(zhuǎn)換
模型中的 $casts
屬性提供了一個便利的方法來將屬性轉(zhuǎn)換為常見的數(shù)據(jù)類型。$casts
屬性應是一個數(shù)組,且數(shù)組的鍵是那些需要被轉(zhuǎn)換的屬性名稱,值則是你希望轉(zhuǎn)換的數(shù)據(jù)類型。支持轉(zhuǎn)換的數(shù)據(jù)類型有: integer
, real
, float
,double
, decimal:<digits>
,string
, boolean
, object
, array
,collection
, date
, datetime
, 和 timestamp
。 當需要轉(zhuǎn)換為 decimal
類型時,你需要定義小數(shù)位的個數(shù),如: decimal:2
示例, 讓我們把以整數(shù)(0
或 1
)形式存儲在數(shù)據(jù)庫中的 is_admin
屬性轉(zhuǎn)成布爾值。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 這個屬性應該被轉(zhuǎn)換為原生類型. * * @var array */ protected $casts = [ 'is_admin' => 'boolean', ]; }
現(xiàn)在當你訪問 is_admin
屬性時,雖然保存在數(shù)據(jù)庫里的值是一個整數(shù)類型,但是返回值總是會被轉(zhuǎn)換成布爾值類型:
$user = App\User::find(1); if ($user->is_admin) { // }
數(shù)組 & JSON 轉(zhuǎn)換
當你在數(shù)據(jù)庫存儲序列化的 JSON 的數(shù)據(jù)時,array
類型的轉(zhuǎn)換非常有用。比如:如果你的數(shù)據(jù)庫具有被序列化為 JSON 的 JSON
或 TEXT
字段類型,并且在 Eloquent 模型中加入了 array
類型轉(zhuǎn)換,那么當你訪問的時候就會自動被轉(zhuǎn)換為 PHP 數(shù)組。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 這個屬性應該被轉(zhuǎn)換為原生類型. * * @var array */ protected $casts = [ 'options' => 'array', ]; }
一旦定義了轉(zhuǎn)換,你訪問 options
屬性時他會自動從 JSON 類型反序列化為 PHP 數(shù)組。當你設置了 options
屬性的值時,給定的數(shù)組也會自動序列化為 JSON 類型存儲:
$user = App\User::find(1); $options = $user->options; $options['key'] = 'value'; $user->options = $options; $user->save();
Date 轉(zhuǎn)換
當使用 date
或 datetime
屬性時,可以指定日期的格式。 這種格式會被用在 模型序列化為數(shù)組或者 JSON:
/** * 這個屬性應該被轉(zhuǎn)化為原生類型. * * @var array */ protected $casts = [ 'created_at' => 'datetime:Y-m-d', ];