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 相关文章推荐
PHP生成静态页
Nov 25 PHP
php session 检测和注销
Mar 16 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 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 实现从数据库导出到.csv文件方法
2017/07/06 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
python之文件读取一行一行的方法
2018/07/12 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
Python使用Matlab命令过程解析
2020/06/04 Python
python 实现图片裁剪小工具
2021/02/02 Python
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
酒店应聘自荐信
2013/11/09 职场文书
股份合作协议书范本
2014/04/14 职场文书
责任担保书范文
2014/05/21 职场文书
企业宗旨标语
2014/06/10 职场文书
与美同行演讲稿
2014/09/13 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
反邪教学习心得体会
2016/01/15 职场文书
导游词之广西漓江
2019/11/02 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers