laravel学习教程之存取器


Posted in PHP onJuly 30, 2016

前言

Laravel是一个简单优雅的PHP Web开发框架,可以将开发者从意大利面条式的代码中解放出来,通过简单、高雅、表达式语法开发出很棒的Web应用,那下面跟着小编一起来学习laravel中的存取器吧。

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_at updated_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();

以上就是小编为大家整理的laravel学习教程之存取器的全部内容,有需要的小伙伴们可以参考学习,小编陆续还会更新laravel相关的知识,请大家继续关注三水点靠木。

PHP 相关文章推荐
NOT NULL 和NULL
Jan 15 PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
PHP的博客ping服务代码
Feb 04 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
Sep 25 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
Jul 28 #PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 #PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 #PHP
thinkphp3.2.3 分页代码分享
Jul 28 #PHP
php实现带读写分离功能的MySQL类完整实例
Jul 28 #PHP
PHP实现带重试功能的curl连接示例
Jul 28 #PHP
php使用strip_tags()去除html标签仍有空白的解决方法
Jul 28 #PHP
You might like
php 方便水印和缩略图的图形类
2009/05/21 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
python标准日志模块logging的使用方法
2013/11/01 Python
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python如何判断数独是否合法
2016/09/08 Python
python将unicode转为str的方法
2017/06/21 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
基于python实现操作git过程代码解析
2020/07/27 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
Weblogic的布署方式
2013/08/23 面试题
坚定理想信念心得体会
2014/03/11 职场文书
钱学森电影观后感
2015/06/04 职场文书