laravel學(xué)習(xí)教程之存取器
前言
Laravel是一個(gè)簡(jiǎn)單優(yōu)雅的PHP Web開(kāi)發(fā)框架,可以將開(kāi)發(fā)者從意大利面條式的代碼中解放出來(lái),通過(guò)簡(jiǎn)單、高雅、表達(dá)式語(yǔ)法開(kāi)發(fā)出很棒的Web應(yīng)用,那下面跟著小編一起來(lái)學(xué)習(xí)laravel中的存取器吧。
Eloquent: 存取器簡(jiǎn)介
訪問(wèn)器和存儲(chǔ)器允許你在獲取或者設(shè)置 Eloquent 模型屬性值時(shí)對(duì)其進(jìn)行格式化操作。比如,你可能希望當(dāng)一個(gè)值存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)之前先對(duì)其進(jìn)行 Laravel encrypter 進(jìn)行加密操作,并且可以在你通過(guò)模型訪問(wèn)的時(shí)候自動(dòng)的進(jìn)行該屬性的解密。
除了可自定義的的訪問(wèn)器和存儲(chǔ)器,Eloquent 也可以自動(dòng)的將日期字段轉(zhuǎn)換為 Carbon 實(shí)例,或者甚至是將字符串字段轉(zhuǎn)換為 JSON。
訪問(wèn)器 & 存取器
定義一個(gè)訪問(wèn)器
為了定義一個(gè)訪問(wèn)器,你需要在你的模型上創(chuàng)建一個(gè) getFooAttribute 方法,其中的 Foo 是你需要進(jìn)行訪問(wèn)的列名的駝峰方式的命名。在這個(gè)例子中,我們將定義一個(gè) first_name 屬性的訪問(wèn)器。這個(gè)訪問(wèn)器會(huì)在 Eloquent 嘗試獲取 first_name 屬性值時(shí)觸發(fā):
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
}
就如你所看到的,屬性原始的值會(huì)被傳遞到訪問(wèn)器中,這允許你對(duì)原始值進(jìn)行操作及返回格式化后的值。你只需要簡(jiǎn)單的訪問(wèn) first_name 屬性就可以從存取器中訪問(wèn)該值:
$user = App\User::find(1); $firstName = $user->first_name;
定義一個(gè)存儲(chǔ)器
為了定義一個(gè)存儲(chǔ)器,你需要在你的模型上定義一個(gè) setFooAttribute 方法,其中的 Foo 是你期望訪問(wèn)的列的駝峰樣式的名稱。那么,這一次,讓我們?yōu)?first_name 屬性定義一個(gè)存儲(chǔ)器。這個(gè)存儲(chǔ)器會(huì)在模型嘗試設(shè)置 first_name 屬性的值時(shí)進(jìn)行調(diào)用:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Set the user's first name.
*
* @param string $value
* @return string
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
}
存儲(chǔ)器會(huì)接收即將設(shè)置到屬性中的值,這允許你對(duì)這個(gè)值進(jìn)行操作,并將其設(shè)置到模型內(nèi)部的 $attributes 屬性中。所以,舉個(gè)示例,如果我們嘗試將 first_name 屬性設(shè)置為 Sally:
$user = App\User::find(1); $user->first_name = 'Sally';
在這個(gè)例子中,setFirstNameAttribute 方法會(huì)被調(diào)用并伴隨 Sally 值。存儲(chǔ)器會(huì)應(yīng)用 strtolower 方法將名字小寫(xiě)化然后將值設(shè)置到內(nèi)部的 $attributes 數(shù)組中。
日期存取器
默認(rèn)的,Eloquent 會(huì)轉(zhuǎn)換 created_at 和 updated_at 列為 Carbon 實(shí)例,這個(gè)實(shí)例可以提供多種有用的方法,并且它繼承自原生 PHP 的 DataTime 類。
你可以自定義哪些字段可以進(jìn)行自動(dòng)的轉(zhuǎn)換,甚至是完全禁用這種轉(zhuǎn)換,你需要在你的模型中復(fù)寫(xiě) $dates 屬性:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The attributes that should be mutated to dates
*
* @var array
*/
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
}
當(dāng)一列被認(rèn)為是日期時(shí),你可以將其設(shè)置為 UNIX 時(shí)間戳,日期字符串(Y-m-d),時(shí)間字符串,和 DateTime / Carbon 實(shí)例,并且日期的值會(huì)自動(dòng)的正確的存儲(chǔ)到數(shù)據(jù)庫(kù)中:
$user = App\User::find(1); $user->deleted_at = Carbon::now(); $user->save();
就如上面所述,當(dāng)獲取的屬性是 $dates 屬性所列出的值之一時(shí),它會(huì)自動(dòng)的被轉(zhuǎn)換為 Carbon 實(shí)例,這允許你在屬性上使用 Carbon 的一些方法:
$user = App\User::find(1); return $user->deleted_at->getTimestamp();
默認(rèn)的,時(shí)間戳被格式化為 Y-m-d H:i:s 的格式。如果你希望自定義時(shí)間戳的格式,你需要在你的模型中設(shè)置 $dateFormat 屬性。該屬性將確定日期屬性將如何存儲(chǔ)到數(shù)據(jù)庫(kù)中以及當(dāng)模型進(jìn)行序列化或者 JSON 化時(shí)如何展示:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The storage format of the model's date columns.
*
* @var string
*/
protected $dateFormat = 'U';
}
屬性轉(zhuǎn)換
你可以在你的模型中定義 $casts 屬性來(lái)提供一種方便的方式將屬性轉(zhuǎn)換為通用的數(shù)據(jù)類型。$casts 屬性應(yīng)該是一個(gè)數(shù)組,并且其每一項(xiàng)的鍵應(yīng)該是需要進(jìn)行轉(zhuǎn)換的屬性名,而其鍵所對(duì)應(yīng)的值應(yīng)該是你需要屬性轉(zhuǎn)換到的類型。支持的轉(zhuǎn)換類型有:integer,real,float,double,string,boolean,object,array,coolection,date,datetime,和 timestamp。
比如,讓我們轉(zhuǎn)換 is_admin 屬性,它在數(shù)據(jù)庫(kù)中存儲(chǔ)的值為一個(gè)整型(0 或者 1),我們將其轉(zhuǎn)換為布爾值:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'is_admin' => 'boolean',
];
}
現(xiàn)在,每當(dāng)你訪問(wèn) is_admin 屬性時(shí),其值都會(huì)被轉(zhuǎn)換為布爾值,即使其在數(shù)據(jù)庫(kù)中存儲(chǔ)的整型值:
$user = App\User::find(1);
if ($user->is_admin) {
//
}
數(shù)組轉(zhuǎn)換
array 轉(zhuǎn)換的類型對(duì)于存儲(chǔ)序列化 JSON 值的列尤其有用。比如,如果數(shù)據(jù)庫(kù)有一個(gè) TEXT 類型的字段,并且其存儲(chǔ)的是序列化的 JSON,如果你添加該屬性的 array 轉(zhuǎn)換,那么當(dāng)你在 Eloquent 模型上訪問(wèn)這個(gè)屬性時(shí),它將會(huì)自動(dòng)的進(jìn)行反序列化為 PHP 的數(shù)組:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'options' => 'array'
];
}
當(dāng)你轉(zhuǎn)義定義完成之后,你可以訪問(wèn) options 屬性,并且它會(huì)自動(dòng)的被從 JSON 反序列化為 PHP 數(shù)組。當(dāng)你設(shè)置值到 options 屬性時(shí),所給定的數(shù)組會(huì)自動(dòng)的序列化為 JSON 格式,然后進(jìn)行存儲(chǔ):
$user = App\User::find(1); $options = $user->options; $options['key'] = 'value'; $user->options = $options; $user->save();
以上就是小編為大家整理的laravel學(xué)習(xí)教程之存取器的全部?jī)?nèi)容,有需要的小伙伴們可以參考學(xué)習(xí),小編陸續(xù)還會(huì)更新laravel相關(guān)的知識(shí),請(qǐng)大家繼續(xù)關(guān)注腳本之家。
相關(guān)文章
PHP實(shí)現(xiàn)網(wǎng)上點(diǎn)歌(二)
PHP實(shí)現(xiàn)網(wǎng)上點(diǎn)歌(二)...2006-10-10
無(wú)數(shù)據(jù)庫(kù)的詳細(xì)域名查詢程序PHP版(4)
無(wú)數(shù)據(jù)庫(kù)的詳細(xì)域名查詢程序PHP版(4)...2006-10-10
一個(gè)沒(méi)有MYSQL數(shù)據(jù)庫(kù)支持的簡(jiǎn)易留言本的編寫(xiě)
一個(gè)沒(méi)有MYSQL數(shù)據(jù)庫(kù)支持的簡(jiǎn)易留言本的編寫(xiě)...2006-10-10
初學(xué)PHP的朋友 經(jīng)常問(wèn)的一些問(wèn)題。不斷更新
將你的項(xiàng)目慢慢寫(xiě)大, 本人水平也一般, 但是對(duì)于初學(xué)者的一些問(wèn)題也可以回答。 一下就是整理出來(lái)的一些問(wèn)題。方便大家查詢。 有一些是一些朋友問(wèn)我的,如果覺(jué)得放在這里不妥, 請(qǐng)與我聯(lián)系。2011-08-08

