优雅使用 illuminate/database 包中的 Collection

或许你很抵抗使用 Laravel , 但是你没有理由不喜欢使用 illuminate/database。这是一个 ORM 的类库。我个人认为,这个类库你是否用的好,其中很重要的一点就是你是否能用好 Collection 这个数据结构,Collection 这个数据结构的源码在 Illuminate\\Database\\Eloquent\\Collection

Collection 这个数据结构有很多方法。各种方法有很多其实都是重复的。官方文档 里面有最全的示例和说明。当不了解一个函数的使用的时候,翻看官方文档是最好的选择。

我这里想介绍一些我在实际工作生活中觉得 Collection 最有用的一些方法。

首先,我把 Collection 的方法做了一下分类。

前提

这篇介绍的 illuminate/database 版本为5.6

例子中使用的 user 表的结构和数据如下:

ORM 相关

load

这里面的 load 方法是非常有用的。它的用处在于把一个 Model 关联的集合给一次性关联查询出来。结合illuminate/database 的相关 relation 是非常有用的

use App\Comment;

class User extends \Illuminate\Database\Eloquent\Model
{
protected $table = "user"; public function comments()
{
$this->hasMany(App\Comment)
}
} $users = User::all();
$users->load('comments');

find

如果你要按照主键进行查找,那么 find 方法是你最好的选择。

$users = User::all();
$user = $users->find(1);

构造类

基本我经常用的只有一个 make 方法。

make

$arr = [1,2,3];
$collection = Collection::make($arr);

提取类

pluck, unique

这两个用的非常多,比如我需要获取 user 表中 所有的 weight 值:

$users = User::all();
$weights = $users->pluck('weight')->unique();

keyBy

如果我需要获取我得到的这批数据以某个字段为key,这种很经常用在有一个非主键的唯一键的情况。

$users = User::all();
$users = $users->keyBy('name');

计算类

计算类的函数就使用非常多了,在各种逻辑中都会用到

max, min, avg, random

$users = User::all();
$maxWeight = $users->max('weight'); $minWeight = $users->min('weight'); $avgWeigth = $users->avg('weight'); $randomUser = $users->random();

判断类

contains

我认为 contains 是用来判断这个数组中是否包含最好用的方法,语义啥的都是最好的,没有之一了。

$users = User::all();
$isContain = $users->contains(function($user) {
return $user->weight > 33;
});

查找过滤类

这一类的各个函数估计有很多都重复了。基本上掌握 where 系列的语句就能满足各种查找过滤需求了。如果再复杂一点的过滤查找逻辑,就使用filter。

$users = User::all();

$overWeightUsers = $users->where('weight', '>', 33);

$firstUser = $users->first();

$firstOverWeightUser = $users->firstWhere('weight', '>', 33);

$nameOkUsers = $users->filter(function($user) {
return ucfirst($user->name) == 'Test4';
});

重组类

重组类的功能非常好用,这类方法用的好,会让你的代码优美很多。而且会享受到函数式编程的快感。

map, reduce

这两个函数的使用就是和其他函数式语言的一样。

$sumShowWeight = $users->map(function($user) {
return ['name' => $user->name, 'show_weight' => $user->weight + 10];
})->reduce(function($carry, $item) {
return $carry + $item['show_weight'];
});

我这里获取所有用户经过计算之后的 show_weight 的 sum 值,这么一句就可以搞定了。

transform

对集合内每个元素都进行操作从而重组一个新的集合:

$showUsers = $users->transform(function($user) {
return ['name' => $user->name, 'show_weight' => $user->weight + 10];
});

groupBy

groupBy也是很常用的,它不仅可以把所需要字段的唯一值获取出来,而且可以获取出每个唯一值有哪些分组。


$users = User::all();
$groupUsers = $users->groupBy('weight');

排序类

排序类一般和其他的函数一起使用。比如获取最轻的用户:

$users = User::all();
$lessWeightUser = $users->sortBy('weight')->first();

思考

illuminate/database 提供的 Collection 函数已经是非常灵活和强大了。如果一定要有一个标准判断你的代码写的好不好,那么一定是代码行数是否够少。而 Collection 使用的函数能让我们的代码行数大大压缩。全面系统思考下这些函数的使用场景是一个能让你的代码越来月优雅的方式。

参考文档

https://scotch.io/tutorials/laravel-collections-php-arrays-on-steroids

优雅使用 illuminate/database 包中的 Collection的更多相关文章

  1. 将PL/SQL代码封装在机灵的包中

    将代码封装在机灵的包中 http://www.oracle.com/technetwork/issue-archive/2013/13-jan/o13plsql-1872456.html 绝大多数基于 ...

  2. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  3. java中的Collection集合类

    随着1998年JDK 1.2的发布,同时新增了常用的Collections集合类,包含了Collection和Map接口.而Dictionary类是在1996年JDK 1.0发布时就已经有了.它们都可 ...

  4. Java:concurrent包下面的Collection接口框架图( CopyOnWriteArraySet, CopyOnWriteArrayList,ConcurrentLinkedQueue,BlockingQueue)

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  5. [Illuminate\Database\QueryException] SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using pas sword: NO) (SQL: select * from information_schema.tables where table_schema = la

    [Illuminate\Database\QueryException] SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost ...

  6. 单点登录(十二)-----遇到问题-----cas启用mongodb验证方式登录后没反应-pac4j-mongo包中的MongoAuthenticatInvocationTargetException

    cas启用mongodb验证方式登录后没反应 控制台输出 2017-02-09 20:27:15,766 INFO [org.jasig.cas.authentication.MongoAuthent ...

  7. Java项目中如何扩展第三方jar包中的类?

    有些时候你对第三方得到jar包中的类并不是很满意,想根据实际情况做一些扩展.如果说第三方的jar包已经提供了一些可扩展的类,比如提供了Interceptor,Filter或者其他的类,那么使用原生的比 ...

  8. [实践]使用JarJar优雅的发布依赖包

    [实践]使用JarJar优雅的发布依赖包 打包工具: Jar Jar Links是一个Java类库重新打包工具. 可以帮助你将其它用到的java库打包并嵌入到你自己的项目jar包中.这样做的原因有: ...

  9. Java并发(6):concurrent包中的Copy-On-Write容器

    一. concurrent包介绍 在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java ...

随机推荐

  1. CentOS、Ubuntu、Debian三个linux比较异同[转]

    Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本. 商业版本以Redhat为代表,开源社区版本则以debian为代表.这些版本各有不同的特点, ...

  2. APACHE 服务器开启URL REWRITE模块的方法

    最近做wordpress,发现固定链接总是设置不了.后来发现是由于apache服务器的URL REWIRITE模块没有开启导致. 查询了资料之后终于设置成功,记录下步骤: 1:开启apache的url ...

  3. Sublime Text 使用介绍、全套快捷键及插件推荐

    开篇:如果说Notepad++是一款不错Code神器,那么Sublime Text应当称得上是神器滴哥.Sublime Text最大的优点就是跨平台,Mac和Windows均可完美使用:其次是强大的插 ...

  4. Linux虚拟主机通过FTP软件创建目录时提示550 Create Directory Operation Failed

    更新时间:2017-06-07 13:26:11   分享: 问题描述 通过FTP软件连接Linux虚拟主机,在尝试创建新目录时,服务器返回错误提示:550 Create Directory Oper ...

  5. JAR包介绍大全用途作用详解JAVA

    jta.jar 标准JTA API必要commons-collections.jar 集合类 必要antlr.jar  ANother Tool for Language Recognition 必要 ...

  6. ublime Text 3安装与使用

    ublime Text 3安装与使用 工具 2015-07-30 10:46 0 34 工欲善其事,必先利其器.好的工具帮助我们节省大量的工作时间,好用的插件使工具更强大. 1. 下载 可以从官网 h ...

  7. C# 处理Word自动生成报告 三、设计模板

    C# 处理Word自动生成报告 一.概述 C# 处理Word自动生成报告 二.数据源例子 C# 处理Word自动生成报告 三.设计模板 C# 处理Word自动生成报告 四.程序处理 既然是模板就少不了 ...

  8. js_6_dom选择

    什么是dom编程? 找 找到html中的标签,赋值给一个变量 改 通过更改这个变量动态地更改html中的内容 返回的内容为列表 如何找到那些标签? id:var find = document.get ...

  9. JavaScript Hoisting

    Hoisting is JavaScript's default behavior of moving all declarations to the top of the current scope ...

  10. 使用telnet发送HTTP请求

    使用telnet发送HTTP请求 写这篇博客,其实没有太大的实际意义,但是还是很有必要的,如果用好Telnet指令,就可以很好的理解HTTP的一些概念,特别是http1.1的持续链接. 要想使用Tel ...