PHPlaravel 基础教程 —— 存取器

Eloquent: 存取器

简介

访问器和存储器允许你在收获或者设置 Eloquent
模型属性值时对其开展格式化操作。比如,你恐怕希望当一个值存储进数据库在此以前先对其进行
Laravel
encrypter

举办加密操作,并且可以在您通过模型访问的时候自动的展开该属性的解密。

除开可自定义的的访问器和存储器,Eloquent 也得以活动的将日期字段转换为
Carbon
实例,或者甚至是将字符串字段转换为 JSON。

访问器 & 存取器

概念一个访问器

为了定义一个访问器,你须要在您的模子上创立一个 getFooAttribute
方法,其中的 Foo
是你需求展开访问的列名的驼峰情势的命名。在那一个事例中,大家将概念一个
first_name 属性的访问器。那么些访问器会在 Eloquent 尝试获得 first_name
属性值时接触:

<?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);
  }
}

就好像你所寓目的,属性原始的值会被传送到访问器中,那允许你对原始值举办操作及再次来到格式化后的值。你只须要简单的访问
first_name 属性就足以从存取器中访问该值:

$user = App\User::find(1);

$firstName = $user->first_name;

概念一个存储器

为了定义一个存储器,你必要在你的模型上定义一个 setFooAttribute
方法,其中的 Foo
是您期望访问的列的驼峰样式的名号。那么,那两次,让大家为 first_name
属性定义一个存储器。这几个存储器会在模型尝试设置 first_name
属性的值时开展调用:

<?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);
  }
}

积存器会接收即将安装到属性中的值,这允许你对那些值举办操作,并将其设置到模型内部的
$attributes 属性中。所以,举个示例,假设我们尝试将 first_name
属性设置为 Sally:

$user = App\User::find(1);

$user->first_name = 'Sally';

在那个事例中,setFirstNameAttribute 方法会被调用并陪同 Sally
值。存储器会应用 strtolower 方法将名字小写化然后将值设置到其中的
$attributes 数组中。

日子存取器

默认的,Eloquent 会转换 created_atupdated_at 列为
Carbon
实例,这些实例可以提供二种实用的点子,并且它屡次三番自原生 PHP 的 DataTime
类。

你可以自定义哪些字段可以展开机动的转移,甚至是完全禁用那种转移,你须要在您的模型中复写
$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'];
}

当一列被认为是日期时,你可以将其安装为 UNIX
时间戳,日期字符串(Y-m-d),时间字符串,和 DateTime / Carbon
实例,并且日期的值会自动的不利的囤积到数据库中:

$user = App\User::find(1);

$user->deleted_at = Carbon::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
{
  /**
   * The storage format of the model's date columns.
   *
   * @var string
   */
  protected $dateFormat = 'U';
}

质量转换

您可以在您的模型中定义 $casts
属性来提供一种便民的方法将品质转换为通用的数据类型。$casts
属性应该是一个数组,并且其每一项的键应该是要求展开更换的属性名,而其键所对应的值应该是你须求属性转换来的门类。辅助的变换类型有:integerrealfloatdoublestringbooleanobjectarraycoolectiondatedatetime,和
timestamp

比如,让我们转换 is_admin 属性,它在数据库中贮存的值为一个整型(0
或者 1),我们将其更换为布尔值:

<?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',
  ];
}

近期,每当你拜访 is_admin
属性时,其值都会被转换为布尔值,即使其在数据库中贮存的整型值:

$user = App\User::find(1);

if ($user->is_admin) {
  //
}

数组转换

array 转换的类型对于仓储体系化 JSON
值的列尤其有用。比如,如果数据库有一个 TEXT
类型的字段,并且其储存的是体系化的 JSON,如果你添加该属性的 array
转换,那么当您在 Eloquent
模型上访问这些特性时,它将会自动的展开反体系化为 PHP 的数组:

<?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'
  ];
}

当您转义定义完毕之后,你可以访问 options 属性,并且它会自动的被从 JSON
反连串化为 PHP 数组。当您设置值到 options
属性时,所给定的数组会自动的队列化为 JSON 格式,然后举行仓储:

$user = App\User::find(1);

$options = $user->options;

$options['key'] = 'value';

$user->options = $options;

$user->save();

相关文章