修改器


    • ##Eloquent: 修改器
    • 簡介
  • ##存取器&修改器
  • 定義一個存取器
    • 定義一個修改器
日期轉換器

屬性型別轉換

#陣列& JSON 轉換

##簡介

當你在Eloquent 模型實例中取得或設定某些屬性值的時候,存取器和修改器允許你對Eloquent 屬性值進行格式化。例如,你可能需要使用 Laravel 加密器 來加密儲存在資料庫中的值,而在使用 Eloquent 模型存取該屬性的時候自動進行解密其值。
###除了自訂存取器和修改器外,Eloquent 也會自動將日期欄位類型轉換為 ###Carbon### 實例,或將 ###文字類型轉換為 JSON###。 #####################

存取器& 修改器

# 定義一個存取器

若要定義一個存取器,則需要在模型上建立一個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_atupdated_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_atupdated_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#, floatdoubledecimal:<digits>string, booleanobject, arraycollectiondatedatetime, 和timestamp。當需要轉換為decimal 類型時,你需要定義小數位的數,如: decimal:2

範例, 讓我們以整數(

01 )形式儲存在資料庫中的 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 的JSONTEXT 欄位類型,並且在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();

################################### #####Date 轉換######當使用###date### 或###datetime### 屬性時,可以指定日期的格式。這種格式會被用在  模型序列化為陣列或 JSON:###
    /**
     * 这个属性应该被转化为原生类型.
     *
     * @var array
     */    
     protected $casts = [     
        'created_at' => 'datetime:Y-m-d',  
         ];
###這篇文章首發在 ###LearnKu.com### 網站上。 ######