[译]Laravel 5.0 之 Eloquent 属性转换

本文译自 Matt Stauffer 的系列文章.


之前完全忘了要把这个 Laravel 5 的系列博客写完,不过最近看到了一篇关于属性转换的简介 Laravel 5 Eloquent Attribute Casting is Awesome, 所以我决定把这个特性加到我的系列文章中。官方文档的 Eloquent 相关部分在这里

什么是属性转换

转换一个属性值的意思是把它转换成某个特定的数据类型(或者是为了确保它是某个特定的数据类型)。数据类型我们都很熟悉了,比如 integer 或者 boolean.

属性转换是 Eloquent 模型的一个功能特性,这个特性让我们可以赋予 Eloquent 模型中的某个属性转换为一个特定的数据类型。

提示:在以前版本中也可以这样做,但是必须为每个属性定义一个自动赋值的方法。而在新版本中可以通过单一的数组配置让模型自动完成这些工作。

这意味着假如你的数据是以特定的格式存储在数据库中,而你在使用时需要的是另外一种格式,现在你可以配置 Eloquent 模型自动完成两种格式之间的转换工作。

为什么要这样做?

最常见的应用场景可能是:当你存储数字的时候——它们默认是返回字符串,但 Eloquent 属性转换可以帮你把字符串转换为 integer, real, float 或者 double,当然还可以转换为 boolean.

但这就是全部了吗?当然不是。

它是如何实现的?

要应用属性转换这个功能,你需要在你的模型中添加一个 protected $casts 的数组变量。

/**
 * The attributes that should be casted to native types.
 *
 * @var array
 */
protected $casts = [
    'is_admin' => 'boolean',
];

如上面代码所示,数组中的每个元素以属性名为 key, 要转换的目标类型为 value. 这个数组变量 $casts 的作用就是告诉 Eloquent:“每次当我访问这个模型中的 is_admin 属性的时候,返回一个类型为 boolean 的值给我”。

转换类型

integer(int)

这会把你指定的属性值转换为整形,通过 return (int) $value 来实现。

float(real|double)

Real, Float 和 Double 在 PHP 中是同一种类型。 PHP 的 (double)(real) 类型转换都是 (float) 的别名。所以指定为这三种时,其实在代码中都是通过 return (float) $value 来实现的。

string

这个很简单,就是把你指定的属性值转为字符串返回,用的是 return (string) $value.

boolean(bool)

这是把你指定的属性值转换为布尔值返回,用 return (bool) $value 实现,这意味着你要把你的数据存储为 01.

object

对象和数组是最有意思的选项。都是用把序列化为 JSON 格式数组的数据转换(反序列化)并返回。如果指定为 object, 那么是用 return json_decode($value) 实现的,返回一个 stdClass 类型的对象。

array

这个值是把 JSON 化的数组转换为 PHP 数组,用 return json_decode($value, true) 实现。

如果你需要看一下源代码,请点击这里

写在最后

如你所见, Eloquent 属性转换功能把我们从大量不必要的重复逻辑中解放出来,并且默默地让我们更容易在数据库中存储 JSON 数据。真是好东西!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏博岩Java大讲堂

Java集合--Queue队列介绍

39780
来自专栏极客猴

Python 中连接字符串效率最高的方式是哪种呢?

在编码过程中,我们经常需要对字符串进行连接处理操作。如果我们能使用优雅的方式来处理字符串连接,那么程序内存开销会小很多。

11120
来自专栏小詹同学

Python系列之零——从零说起!!!

2017年可谓是人工智能元年,要问哪个行业最火,詹小白不敢确定,但要问哪个编程语言最热门,好吧,詹小白还是不敢说太满。但是!至少从舆论Pytho...

384100
来自专栏精讲JAVA

Gof设计模式之工厂模式(四)

定义 工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式...

21080
来自专栏老九学堂

1分钟彻底理解C语言指针的概念

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节...

53780
来自专栏嵌入式程序猿

号外号外:无规矩不成方圆(4)

本文MISRA规则由嵌入式程序猿整理自网络,版权归原作者所有 不能使用三字母词 三字母词由2 个问号序列后跟1 个确定字符组成(如, ??- 代表“ ~”(非)...

27850
来自专栏CSDN技术头条

不到40行代码构建正则表达式引擎

原文:Build a Regex Engine in Less than 40 Lines of Code (作者:Nick Drane ,翻译:Diwei) ...

20360
来自专栏林冠宏的技术文章

经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。

作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:htt...

734150
来自专栏苦逼的码农

Hash冲突之开放地址法

比如说我的输入是任意一个自然数(0,1,2,3...),而我要求经过一个函数后我的输出的数的范围要在0-9这样一个范围之间。

80820
来自专栏鸿的学习笔记

python新手应注意的一些小问题

最重要的是看你公司喜欢哪个版本的python。。。。对于你个人而言,python2与python3的差别你可以忽略。。。。 一.注意pep8的编程风格,请记住...

65320

扫码关注云+社区

领取腾讯云代金券