laravel学习教程之存取器
发布时间:2023-06-07 20:01:12
前言
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
属性应该是一个数组,并且其每一项的键应该是需要进行转换的属性名,而其键所对应的值应该是你需要属性转换到的类型。支持的转换类型有:integer
,real
,float
,double
,string
,boolean
,object
,array
,coolection
,date
,datetime
,和 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();
来源:http://www.jianshu.com/p/4ec528e37209


猜你喜欢
- 目录Mock概念Mock类简单的例子体验下 Mock 的功能特点一个相对正式的 Mock 例子一个完整的测试例子断言方法Mock概念mock
- 前言正常图片转化成素描图片无非对图片像素的处理,矩阵变化而已。目前很多拍照修图App都有这一功能,核心代码不超30行。如下利用 Python
- 1.首先安装 PyPDF2 库:pip install PyPDF22.然后保存下面文件(已带注释,具体实现请自己思考)import osi
- 各人觉得这些LOGO的设计都很好,简洁,明了,大方。特整理出来与大家分享,希望能吸取设计经验。asp之家祝愿各位09年身体健康,万事如意,网
- 大家可能都不大熟悉关于pdb这个模块,实际上就是python中的内置模块,主要作用于命令行调试代码,下面我们将通过是哪个小结给大家详细介绍下
- 在写代码的时候,往往会漏掉日志这个关键因素,导致功能在使用的时候出错却无法溯源。其实,只需要写一个非常简单的日志装饰器,我们就能大大提升排查
- 1、层次索引1.1 定义在某一个方向拥有多个(两个及两个以上)索引级别,就叫做层次索引。通过层次化索引,pandas能够以较低维度形式处理高
- Python字符串拼接的6种方法:1.加号第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接
- 有史以来最牛逼的绘图工具,没有之一plotly是现代平台的敏捷商业智能和数据科学库,它作为一款开源的绘图库,可以应用于Python、R、MA
- I. 简介MoviePy 是什么?MoviePy 是一个使用 Python 编写的开源库,用于在视频编辑中创建、编辑和操作视频文件。它是一款
- 目录什么是传值(值传递)什么是传引用(引用传递)迷惑Mapchan类型和map、chan都不一样的slice小结对于了解一门语言来说,会关心
- 404错误是指在服务器找不到指定的页面。404错误页面是可以自定义的。Smashing Magazine为我们挑选了40个有创意的404错误
- 一、实验目的:1.掌握Python中柱状图、条形图绘图函数的使用2.利用上述绘图函数实现数据可视化二、实验内容:1.练习python中柱状图
- 本文实例讲述了Django中使用group_by的方法。分享给大家供大家参考。具体分析如下:在Django中怎样使用group_by语句呢?
- 前言总之,两者都是用来重塑tensor的shape的。view只适合对满足连续性条件(contiguous)的tensor进行操作,而res
- MySQL批量插入问题在开发项目时,因为有一些旧系统的基础数据需要提前导入,所以我在导入时做了批量导入操作 ,但是因为MySQL中的一次可接
- 大名鼎鼎的FCKeditor终于在最近发布新版本了,与增加版本号不同,这次完全把它改名了,更名为CKeditor。这应该是和它的开发公司CK
- 前言本文主要给大家介绍了关于Python用字符串调用函数或方法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:先看一个例子:&
- 如何做一个树状展开视图来显示自己的记录结构?在SQL中,如何做一个可收起和展开树状结构图?就是资源管理器左栏的那种效果。这要用到Data s
- 如下所示:由图中可见,当前使用的是 unittest 测试框架修改方式如下:来源:https://blog.csdn.net/HeatDea