Laravel 5.1 文档攻略 —— Eloquent: 读取器和修饰器
简介
这一章其实很简单,Model的属性不是和数据表的字段一一对应吗?
那么在存储和呈现数据的时候,我们有时会需要预先对数据一些处理。比如为了保密,我们可以利用Laravel encrypter在数据库里存加密的数据,别人拿去也没用,我们可以把一段解密程序放在model里,只有通过model里的解密程序才能把数据解密并呈现出来;
除了可以改模型的属性值,Eloquent还可以改属性(字段)的数据类型。
读取器和修饰器(Accessors & Mutators)
一看到这两个字,马上高大尚了,Accessors & Mutators 也就是 Getter 和 Setter, 是数据存储前后的一些预处理方法。这一般是Java,C#这些”高级”的语言说法,Taylor把它用在屌丝PHP这里了,然而并无违和感。
读取器
namespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{public function getFirstNameAttribute($value){return ucfirst($value);}}
既然是get,就是在从数据库读数据的时候对数据进行修改;
注意getFirstNameAttribute这个写法,这是个魔术方法,FirstName是你的字段名,需要用驼峰命名法;
方法内你就可以对字段值(属性值)进行处理;
例子是把首字母转化为大写了。
$user = App\User::find(1);$firstName = $user->first_name;
回头你在使用属性的时候,发现first_name的值首字母自动变成大写了。
修饰器
namespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{public function setFirstNameAttribute($value){$this->attributes['first_name'] = strtolower($value);}}
既然是set方法,那么肯定是写入数据之前对数据进行处理;
上面这个例子是把名字全变成小写字母存入数据库(包括对象的属性也会自动转换为小写)。
日期修饰器(Mutators)
Eloquent的模型会自动将日期类型字段进行修饰处理,例如默认的created_at和updated_at字段,在模型里,它们会自动转换成为Carbon类的对象,Carbon类里有很多用来处理时间方法。
namespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{protected $dates = ['created_at', 'updated_at', 'deleted_at'];}
这里就指定了那些字段是属于日期类型的字段。
在模型中指定为日期类型的字段后,你可以使用 UNIX 时间戳, date string (Y-m-d)格式,date-time string和Carbon类对象等方式给该字段赋值:
$user = App\User::find(1);$user->deleted_at = Carbon::now();$user->save();
下面说一个比较特殊的点:
$user = App\User::find(1);return $user->created_at->getTimestamp();
假设你打印$user,你会发现它大概是这样的:
App\Models\User {#1270id: 8,name: "woody",email: "72727921@qq.com",active: 1,created_at: "2015-08-05 07:27:09",updated_at: "2015-09-16 01:34:36",}
但是如果你打印$user->created_at, 你会发现它被自动转哈为Carbon对象:
Carbon\Carbon {#1267+"date": "2015-08-05 07:27:09.000000",+"timezone_type": 3,+"timezone": "UTC",}
所以后面可以接Carbon的各种方法。但是,如果你在blade视图中直接使用{{$user->created_at}}, 出来将是字符串类型。
默认的日期存储格式是Y-m-d H:i:s, 你可以改model的$dateFormat属性来改变格式:
namespace App;use Illuminate\Database\Eloquent\Model;class Flight extends Model{protected $dateFormat = 'U';}
注意,这个格式不仅将影响日期在数据库中的存储格式,还将影响模型在转换成为数组或json时,日期字段的保存格式。
属性数值类型转换
从数据读出来的值,有时候你不仅希望改变它的值,还想改变它的数值类型。当然,你可以用accessor实现这一点,但laravel 提供了更直接的方法$cast。解释一下cast的语义,cast不是改变,而是暂时转换。
假设is_admin是以0,1整数的形式在数据库中存储的,
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{protected $casts = ['is_admin' => 'boolean',];}
那么,这样设置过后读出来将是布尔值;
数组类型转换
有一个应用场景很常见,就是有些字段我们是以json序列化格式存入数据的,比如一组图片,一批选项值;
这个时候我们用这些值的时候要反序列化,每次都要处理很麻烦,这里我们可以用:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{protected $casts = ['options' => 'array',];}
这样,对于options这个字段,每次读出来的就是一个数组了,方便在PHP里使用。
$user = App\User::find(1);$options = $user->options;$options['key'] = 'value';$user->options = $options;$user->save();
看到没有,取出来当数组使用,存回去的时候数组存回去,存到数据库里面自动序列化变string。
Laravel 5.1 文档攻略 —— Eloquent: 读取器和修饰器的更多相关文章
- Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化
在写api的时候,数据一般是以json格式进行传输的,没有对象可以直接使用.这个时候,对数据的序列化转换就很重要,Eloquent提供了很方便的方法和约定,不仅可以转换,还可以控制里面的键值. 基本用 ...
- Laravel 5.1 文档攻略 —— Eloquent Collection
简介 像all()和get(),还有一些处理模型关系这种会返回多条数据的方法,在Eloquent里面会返回一个collection对象集合(对象装在对象里),而不是像DQB的数组结果集合(对象装在数组 ...
- Laravel 5.1 文档攻略 —— Eloquent:模型关系
简介 其实大家都知道,数据表之间都是可以关联的,前面讲过了,Eloquent ORM是数据模型操作代替表操作,那么表的关联查询,在Eloquent这里也就是模型间的关联查询,这就是本章的主要内容: E ...
- [ Laravel 5.5 文档 ] 处理用户请求 —— HTTP 请求的过滤器:中间件
[ Laravel 5.5 文档 ] 处理用户请求 —— HTTP 请求的过滤器:中间件 http://laravelacademy.org/post/7812.html 简介 中间件为过滤进入应用的 ...
- [ Laravel 5.5 文档 ] 快速入门 —— 目录结构篇
简介 Laravel 默认的目录结构试图为不管是大型应用还是小型应用提供一个良好的起点.当然,你也可以按照自己的喜好重新组织应用的目录结构,因为 Laravel 对于指定类在何处被加载没有任何限制 — ...
- Laravel 5.5 文档 ] 快速入门 —— 安装配置篇
服务器要求 Laravel 框架对PHP版本和扩展有一定要求,不过这些要求 Laravel Homestead 都已经满足了,不过如果你没有使用 Homestead 的话(那真是一件很遗憾的事情),有 ...
- [ Laravel 5.5 文档 ] 底层原理 —— 一次 Laravel 请求的生命周期
Posted on 2018年3月5日 by 学院君 简介 当我们使用现实世界中的任何工具时,如果理解了该工具的工作原理,那么用起来就会得心应手,应用开发也是如此.当你理解了开发工具如何工作,用起 ...
- Elasticsearch之文档的增删改查以及ik分词器
文档的增删改查 增加文档 使用elasticsearch-head查看 修改文档 使用elasticsearch-head查看 删除文档 使用elasticsearch-head查看 查看文档的三种方 ...
- [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。
1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...
随机推荐
- php 简单分页类
/** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 privat ...
- mysql查看表使用的数据库引擎
看某个使用的引擎,在显示结果里参数engine后面的就表示该表当前用的存储引擎: mysql> show create table 表名; 看mysql支持哪些存储引擎: mysql> s ...
- IEquatable 的Equals 代替 object 的Equals
struct Point2 : IEquatable<Point2> { public int X { get; set; } public int Y { get; set; } pub ...
- Hibernate学习总结
首先声明这是个坑爹的框架 属于ssh经典框架中的持久层框架,说白了就是管理数据库的. 下载地址:http://hibernate.org/orm/ 这里写了版本5.2,下载下来的基本不怎么会用,因为文 ...
- crond不执行原因分析
自己写了个脚本,让crond来周期性执行脚本进行备份,但是在crontab -e里面加入了执行脚本之后,发现没有执行,后来分析了一下,crond不执行的原因主要有以下几个方面: 1.crond服务没启 ...
- 设计模式学习——观察者模式(Observer Pattern)
0. 前言 观察者模式在许多地方都能够用到,特别是作为MVC模式的一部分,在MVC中,模型(M):存放数据,视图(V):显示数据.当模型中的数据发生改变时,视图会得到通知,这是典型的观察者模式. 1. ...
- Django笔记-登陆、注册(利用cookie实现)
1.项目结构: 2.关键代码: settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'djang ...
- AutoMocker单元测试
/// <summary> /// 测试获取所有物流 /// </summary> [TestMethod] public void TestExpressController ...
- SmartUpLoad自动上传包
一枚默默的开发学习者 用以下代码生成文件名即可 1 package info.haowei.util; 2 3 import java.text.SimpleDateFormat; 4 import ...
- 使用commons-fileupload包进行大文件上传注意事项
项目中使用 commons-fileupload-1.2.1.jar 进行大文件上传. 测试了一把,效果很不错. 总结如下: 必须设置好上传文件的最大阀值 final long MAX_SIZE = ...