源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

laravel学习教程之存取器

  • 时间:2022-09-02 03:55 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:laravel学习教程之存取器
[b]前言[/b] Laravel是一个简单优雅的PHP Web开发框架,可以将开发者从意大利面条式的代码中解放出来,通过简单、高雅、表达式语法开发出很棒的Web应用,那下面跟着小编一起来学习laravel中的存取器吧。 [b]Eloquent: 存取器简介[/b] 访问器和存储器允许你在获取或者设置[b]Eloquent 模型[/b]属性值时对其进行格式化操作。比如,你可能希望当一个值存储进数据库之前先对其进行[b]Laravel encrypter [/b]进行加密操作,并且可以在你通过模型访问的时候自动的进行该属性的解密。 除了可自定义的的访问器和存储器,[b]Eloquent[/b] 也可以自动的将[b]日期字段[/b]转换为[b]Carbon 实例[/b],或者甚至是将[b]字符串字段[/b]转换为[b]JSON[/b]。 [b]访问器 & 存取器[/b] [b]定义一个访问器[/b] 为了定义一个访问器,你需要在你的模型上创建一个[code] getFooAttribute [/code]方法,其中的 [code]Foo[/code] 是你需要进行访问的列名的驼峰方式的命名。在这个例子中,我们将定义一个 [code]first_name[/code] 属性的访问器。这个访问器会在 Eloquent 尝试获取[code] first_name [/code]属性值时触发:
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
 /**
  * Get the user's first name.
  *
  * @param string $value
  * @return string
  */
 public function getFirstNameAttribute($value)
 {
  return ucfirst($value);
 }
}
就如你所看到的,属性原始的值会被传递到访问器中,这允许你对原始值进行操作及返回格式化后的值。你只需要简单的访问 [code]first_name [/code]属性就可以从存取器中访问该值:
$user = AppUser::find(1);

$firstName = $user->first_name;
[b]定义一个存储器[/b] 为了定义一个存储器,你需要在你的模型上定义一个 [code]setFooAttribute[/code] 方法,其中的 [code]Foo[/code] 是你期望访问的列的驼峰样式的名称。那么,这一次,让我们为 [code]first_name [/code]属性定义一个存储器。这个存储器会在模型尝试设置 [code]first_name [/code]属性的值时进行调用:
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

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);
 }
}
存储器会接收即将设置到属性中的值,这允许你对这个值进行操作,并将其设置到模型内部的 [code]$attributes [/code]属性中。所以,举个示例,如果我们尝试将 [code]first_name [/code]属性设置为 [code]Sally[/code]:
$user = AppUser::find(1);

$user->first_name = 'Sally';
在这个例子中,[code]setFirstNameAttribute[/code] 方法会被调用并伴随 [code]Sally[/code] 值。存储器会应用 [code]strtolower[/code] 方法将名字小写化然后将值设置到内部的 [code]$attributes [/code]数组中。 [b]日期存取器[/b] 默认的,[code]Eloquent[/code] 会转换 [code]created_at [/code]和 [code]updated_at[/code] 列为[code] Carbon[/code] 实例,这个实例可以提供多种有用的方法,并且它继承自原生 PHP 的 [code]DataTime[/code] 类。 你可以自定义哪些字段可以进行自动的转换,甚至是完全禁用这种转换,你需要在你的模型中复写 [code]$dates [/code]属性:
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
 /**
  * The attributes that should be mutated to dates
  *
  * @var array
  */
 protected $dates = ['created_at', 'updated_at', 'deleted_at'];
}
当一列被认为是日期时,你可以将其设置为 UNIX 时间戳,日期字符串([code]Y-m-d[/code]),时间字符串,和 [code]DateTime / Carbon [/code]实例,并且日期的值会自动的正确的存储到数据库中:
$user = AppUser::find(1);

$user->deleted_at = Carbon::now();

$user->save();
就如上面所述,当获取的属性是 [code]$dates[/code] 属性所列出的值之一时,它会自动的被转换为 [code]Carbon[/code] 实例,这允许你在属性上使用 [code]Carbon[/code] 的一些方法:
$user = AppUser::find(1);

return $user->deleted_at->getTimestamp();
默认的,时间戳被格式化为 [code]Y-m-d H:i:s[/code] 的格式。如果你希望自定义时间戳的格式,你需要在你的模型中设置 [code]$dateFormat [/code]属性。该属性将确定日期属性将如何存储到数据库中以及当模型进行序列化或者 [code]JSON[/code] 化时如何展示:
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Flight extends Model
{
 /**
  * The storage format of the model's date columns.
  *
  * @var string
  */
 protected $dateFormat = 'U';
}
[b]属性转换[/b] 你可以在你的模型中定义 [code]$casts [/code]属性来提供一种方便的方式将属性转换为通用的数据类型。[code]$casts[/code] 属性应该是一个数组,并且其每一项的键应该是需要进行转换的属性名,而其键所对应的值应该是你需要属性转换到的类型。支持的转换类型有:[code]integer[/code],[code]real[/code],[code]float[/code],[code]double[/code],[code]string[/code],[code]boolean[/code],[code]object[/code],[code]array[/code],[code]coolection[/code],[code]date[/code],[code]datetime[/code],和 [code]timestamp[/code]。 比如,让我们转换[code] is_admin[/code] 属性,它在数据库中存储的值为一个整型(0 或者 1),我们将其转换为布尔值:
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
 /**
  * The attributes that should be casted to native types.
  *
  * @var array
  */
 protected $casts = [
  'is_admin' => 'boolean',
 ];
}
现在,每当你访问 [code]is_admin[/code] 属性时,其值都会被转换为布尔值,即使其在数据库中存储的整型值:
$user = AppUser::find(1);

if ($user->is_admin) {
 //
}
[b]数组转换[/b] [code]array[/code] 转换的类型对于存储序列化 JSON 值的列尤其有用。比如,如果数据库有一个 TEXT 类型的字段,并且其存储的是序列化的 JSON,如果你添加该属性的 [code]array[/code] 转换,那么当你在 Eloquent 模型上访问这个属性时,它将会自动的进行反序列化为 PHP 的数组:
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
 /**
  * The attributes that should be casted to native types.
  *
  * @var array
  */
 protected $casts = [
  'options' => 'array'
 ];
}
当你转义定义完成之后,你可以访问 [code]options [/code]属性,并且它会自动的被从 JSON 反序列化为 PHP 数组。当你设置值到 [code]options [/code]属性时,所给定的数组会自动的序列化为 JSON 格式,然后进行存储:
$user = AppUser::find(1);

$options = $user->options;

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

$user->options = $options;

$user->save();
以上就是小编为大家整理的laravel学习教程之存取器的全部内容,有需要的小伙伴们可以参考学习,小编陆续还会更新laravel相关的知识,请大家继续关注编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部