文章转自:learnku.com/laravel/t/2…

Laravel Eloquent 通常返回一个集合作为结果,集合包含很多有用的、功能强大的方法。你可以很方便的对集合进行过滤、修改等操作。本次教程就一起来看一看集合的常用方法及功能。 集合并不仅限于 eloquent ,也可以单独使用。但 Eloquent 的结果就是一个集合。你可以使用助手函数 collect 将数组转化为集合。下面所列出的集合的方法适用于 eloquent 结果的同时也适用于集合本身。

比方说,你有一个帖子模型。 你找到所有 php 类别的帖子。

$posts = App\Post::where('category', 'php')->get();
复制代码

上面的命令返回一个集合。 集合是一个laravel类,它在内部使用数组函数并为它们添加许多功能。

你可以简单的使用 collect 方法创建一个集合,如下:

$collection = collect([['user_id' => '1','title' => 'Helpers in Laravel','content' => 'Create custom helpers in Laravel','category' => 'php'],['user_id' => '2','title' => 'Testing in Laravel','content' => 'Testing File Uploads in Laravel','category' => 'php'],['user_id' => '3','title' => 'Telegram Bot','content' => 'Crypto Telegram Bot in Laravel','category' => 'php'],
]);
复制代码

上面的数组实际上是 Post 模型的值。 在本教程中,我们将使用此数组进行简化。 请记住,一切都将以同样的方式基于 eloquent。

当我们在 eloquent 集合上使用辅助方法时,不会再查询数据库。 我们首先要从数据库中获取所有结果,然后我们使用集合方法来过滤和修改它们,而无需查询数据库。

filter()

filter,最有用的 laravel 集合方法之一,允许您使用回调过滤集合。 它只传递那些返回true的项。 所有其他项目都被删除。 filter 返回一个新实例而不更改原始实例。 它接受 valuekey 作为回调中的两个参数。

$filter = $collection->filter(function($value, $key) {if ($value['user_id'] == 2) {return true;}
});$filter->all();
复制代码

all 方法返回底层数组。 上面的代码返回以下响应。

[1 => ["user_id" => 2,"title" => "Testing in Laravel","content" => "Testing File Uploads in Laravel","category" => "php"]
]
复制代码

search()

search 方法可以用给定的值查找集合。如果这个值在集合中,会返回对应的键。如果没有数据项匹配对应的值,会返回 false

$names = collect(['Alex', 'John', 'Jason', 'Martyn', 'Hanlin']);$names->search('Jason');// 2
复制代码

search 方法默认使用松散比较。你可以在它的第二个参数传 true 使用严格比较。

你也可以传你自己的回调函数到 search 方法中。将返回通过回调真值测试的第一个项的键。

$names = collect(['Alex', 'John', 'Jason', 'Martyn', 'Hanlin']);$names->search(function($value, $key) {return strlen($value) == 6;
});// 3
复制代码

chunk()

chunk 方法将集合分割为多个给定大小的较小集合。将集合显示到网格中非常有用。

$prices = collect([18, 23, 65, 36, 97, 43, 81]);$prices = $prices->chunk(3);$prices->toArray();
复制代码

以上代码生成效果。

[0 => [0 => 18,1 => 23,2 => 65],1 => [3 => 36,4 => 97,5 => 43],2 => [6 => 81]
]
复制代码

dump()

dump 打印集合的方法。 它可用于在任何位置的调试和查找集合内的内容。

$collection->whereIn('user_id', [1, 2])->dump()->where('user_id', 1);
复制代码

dump 上述代码结果。

map()

map 方法用于遍历整个集合。 它接受回调作为参数。 valuekey 被传递给回调。 回调可以修改值并返回它们。 最后,返回修改项的新集合实例。

$changed = $collection->map(function ($value, $key) {$value['user_id'] += 1;return $value;
});return $changed->all();
复制代码

基本上,它将 user_id 增加1。

上面代码的响应如下所示。

[["user_id" => 2,"title" => "Helpers in Laravel","content" => "Create custom helpers in Laravel","category" => "php"],["user_id" => 3,"title" => "Testing in Laravel","content" => "Testing File Uploads in Laravel","category" => "php"],["user_id" => 4,"title" => "Telegram Bot","content" => "Crypto Telegram Bot in Laravel","category" => "php"]
];
复制代码

zip()

Zip 方法会将给定数组的值与集合的值合并在一起。相同索引的值会添加在一起,这意味着,数组的第一个值会与集合的第一个值合并。在这里,我会使用我们在上面刚刚创建的集合。这对 Eloquent 集合同样有效。

$zipped = $collection->zip([1, 2, 3]);$zipped->all();
复制代码

JSON 响应会像这样。

所以,基本上就是这样。如果数组的长度小于集合的长度,Laravel 会给剩下的 Collection 类型的元素末尾添加 null。类似地,如果数组的长度比集合的长度大,Laravel 会给 Collection 类型的元素添加 null,然后再接着数组的值。

whereNotIn()

您可以使用 whereNotIn 方法简单地按照给定数组中未包含的键值过滤集合。 它基本上与 whereIn 相反。 此外,此方法在匹配值时使用宽松比较 ==

让我们过滤 $collection,其中 user_id 既不是 1 也不是 2的。

$collection->whereNotIn('user_id', [1, 2]);
复制代码

上面的语句将只返回 $collection 中的最后一项。 第一个参数是键,第二个参数是值数组。 如果是 eloquent 的话,第一个参数将是列的名称,第二个参数将是一个值数组。

max()

max 方法返回给定键的最大值。 你可以通过调用max来找到最大的 user_id。 它通常用于价格或任何其他数字之类的比较,但为了演示,我们使用 user_id。 它也可以用于字符串,在这种情况下,Z> a

$collection->max('user_id');
复制代码

上面的语句将返回最大的 user_id,在我们的例子中是 3

pluck()

pluck 方法返回指定键的所有值。 它对于提取一列的值很有用。

$title = $collection->pluck('title');
$title->all();
复制代码

结果看起来像这样。

["Helpers in Laravel","Testing in Laravel","Telegram Bot"
]
复制代码

When working with eloquent, you can pass a column name as an argument to extract its values. pluck also accepts a second argument and in the case of eloquent collections, it can be another column name. It will result in collection keyed by the values of the second argument. 使用 eloquent 时,可以将列名作为参数传递以提取值。 pluck 也接受第二个参数,对于 eloquent 的集合,它可以是另一个列名。 它将导致由第二个参数的值作为键的集合。

$title = $collection->pluck('user_id', 'title');
$title->all();
复制代码

结果如下:

["Helpers in Laravel" => 1,"Testing in Laravel" => 2,"Telegram Bot" => 3
]
复制代码

each()

each 是一种迭代整个集合的简单方法。 它接受一个带有两个参数的回调:它正在迭代的项和键。 Key 是基于 0 的索引。

$collection->each(function ($item, $key) {info($item['user_id']);
});
复制代码

上面代码,只是记录每个项的 user_id

在迭代 eloquent 集合时,您可以将所有列值作为项属性进行访问。 以下是我们如何迭代所有帖子。

$posts = App\Post::all();$posts->each(function ($item, $key) {// Do something
});
复制代码

如果回调中返回 false,它将停止迭代项目。

$collection->each(function ($item, $key) {// Tasksif ($key == 1) {return false;}
});
复制代码

tap()

tap() 方法允许你随时加入集合。 它接受回调并传递并将集合传递给它。 您可以对项目执行任何操作,而无需更改集合本身。 因此,您可以在任何时候使用tap来加入集合,而不会改变集合。

$collection->whereNotIn('user_id', 3)->tap(function ($collection) {$collection = $collection->where('user_id', 1);info($collection->values());})->all();
复制代码

在上面使用的 tap 方法中,我们修改了集合,然后记录了值。 您可以对 tap 中的集合做任何您想做的事情。 上面命令的响应是:

[["user_id" => "1","title" => "Helpers in Laravel","content" => "Create custom helpers in Laravel","category" => "php"],["user_id" => "2","title" => "Testing in Laravel","content" => "Testing File Uploads in Laravel","category" => "php"]
]
复制代码

你可以看到 tap 不会修改集合实例。

pipe()

pipe 方法非常类似于 tap 方法,因为它们都在集合管道中使用。 pipe 方法将集合传递给回调并返回结果。

$collection->pipe(function($collection) {return $collection->min('user_id');
});
复制代码

上述命令的响应是 1。 如果从 pipe回调中返回集合实例,也可以链接其他方法。

contains()

contains 方法只检查集合是否包含给定值。 只传递一个参数时才会出现这种情况。

$contains = collect(['country' => 'USA', 'state' => 'NY']);$contains->contains('USA');
// true$contains->contains('UK');
// false
复制代码

如果将 键 / 值 对传递给 contains 方法,它将检查给定的键值对是否存在。

$collection->contains('user_id', '1');
// true$collection->contains('title', 'Not Found Title');
// false
复制代码

您还可以将回调作为参数传递给回调方法。 将对集合中的每个项目运行回调,如果其中任何一个项目通过了真值测试,它将返回 true 否则返回 false

$collection->contains(function ($value, $key) {return strlen($value['title']) < 13;
});
// true
复制代码

回调函数接受当前迭代项和键的两个参数值。 这里我们只是检查标题的长度是否小于13。在 Telegram Bot 中它是12,所以它返回 true

forget()

forget 只是从集合中删除该项。 您只需传递一个键,它就会从集合中删除该项目。

$forget = collect(['country' => 'usa', 'state' => 'ny']);$forget->forget('country')->all();
复制代码

上面代码响应如下:

["state" => "ny"
]
复制代码

forget 不适用于多维数组。

avg()

avg 方法返回平均值。 你只需传递一个键作为参数,avg 方法返回平均值。 你也可以使用 average 方法,它基本上是 avg 的别名。

$avg = collect([['shoes' => 10],['shoes' => 35],['shoes' => 7],['shoes' => 68],
])->avg('shoes');
复制代码

上面的代码返回 30 ,这是所有四个数字的平均值。 如果你没有将任何键传递给avg 方法并且所有项都是数字,它将返回所有数字的平均值。 如果键未作为参数传递且集合包含键/值对,则 avg 方法返回 0。

$avg = collect([12, 32, 54, 92, 37]);$avg->avg();
复制代码

上面的代码返回 45.4,这是所有五个数字的平均值。

您可以使用这些 laravel 集合方法在您自己的项目中处理集合。

文章转自:learnku.com/laravel/t/2…
更多文章:learnku.com/laravel/c/t…

转载于:https://juejin.im/post/5cb98b3a6fb9a068ad1b195c

十五个常用的 Laravel 集合(Collection)相关推荐

  1. 用集合return多个值_十五个常用的 Laravel 集合(Collection)

    Laravel Eloquent 通常返回一个集合作为结果,集合包含很多有用的.功能强大的方法.你可以很方便的对集合进行过滤.修改等操作.本次教程就一起来看一看集合的常用方法及功能. 集合并不仅限于 ...

  2. 五金模具设计丨十五种常用的模具标准化结构,你掌握了几种?

    ---常用标准化结构--- 1压线入子结构 压线的目的: (1) 材料预变形,减少折弯时的阻力,使折弯时的尺寸更为准确. (2)防止折弯时产生的拉料变形. 2压筋入子结构 压筋目的: (1)減小折弯时 ...

  3. 第十五期:详解Java集合框架,让你全面掌握!

    一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...

  4. centos 计算器_Linux学习之CentOS(十五)--Linux常用命令之bc、man、shutdown...

    在写这篇随笔时,翻看了一下上一篇随笔的写作日期,发现已经是4月8号了,时间已经过了11天了!!!过了这么久没有更新Linux学习系列的随笔了,是因为我又松懈了Linux的学习了吗?不是的!!!是因为最 ...

  5. 二十五、PHP框架Laravel学习笔记——模型的一对一关联

    一.关联概念 关联模型,即:两张或以上的表进行一定规则的绑定关联: 比如:一个学生(学生表)对应一张个人信息卡(信息表),这种就是一对一: 再比如:一篇博文(帖子表)对应多个评论(评论表),这种就是一 ...

  6. 十五、PHP框架Laravel学习笔记——构造器的 join 查询

    一.join 查询 使用 join 实现内联接的多表查询,比如三张表进行 inner join 查询: $users = DB::table('users') ->join('books', ' ...

  7. plsql 循环存储过程返回数据集合_Java基础(十五)——Collection集合、泛型 - 寒江雨

    Collection集合 集合概述 集合:集合是Java中提供的一种容器,可以用来存储多个数据 数组的长度是固定的,集合的长度是可变的 数组中存储的是同一种数据类型的元素,可以存储基本数据类型也可以存 ...

  8. 二十二、PHP框架Laravel学习笔记——集合的使用

    一.创建集合 什么是集合?即:它是一种更具读取性和处理能力的数组封装: 比如,我们从数据库得到的数据列表,它就是一种集合: 数据集合,提供了大量的方法方便我们进行各种操作: 除了数据库对象返回的数据集 ...

  9. java学习记录十五:集合二Collections、Set、Map

    java学习记录十五:集合二 一.Collections工具类 一.解释 二.常用方法 1.打乱集合顺序 2.按照默认规则排序 3.按指定规则排序 4.批量添加元素 二.可变参数 一.解释 二.写法 ...

最新文章

  1. android gdb 命令大全,ndk-gdb  |  Android NDK  |  Android Developers
  2. linux 裸设备 逻辑卷,Linux通过逻辑卷使用裸设备
  3. DOM4j读取XML文件(SAXReader)
  4. Linux安装部署FTP服务器
  5. 人工智能规模化落地还有哪些坑?阿里副总裁华先胜连麦详解!
  6. linux删除多余日志,linux 删除日志
  7. 数据科学之——大数据体系
  8. MySQL高级进阶(三)、InnoDB存储引擎详解
  9. 在vs2013下利用vb.net简单使用WebService实例
  10. SpringBoot 错误:Field userService in com.lyh.Controller.UserController required a bean of...
  11. 快速切换node版本
  12. centos7系统文件名颜色含义
  13. 渐变背景和背景图片并存
  14. 微信小程序服务器该如何选择
  15. matlab抢占时隙算法,ALOHA anti-collision、二进制数搜索算法以及帧时隙算法
  16. 配置iis解析php
  17. Java实现 LeetCode 91 解码方法
  18. Java开发之旅之面向对象
  19. kubernetes资源类型--secret和Service Account
  20. python换零钱_Python之100个项目:零钱转换程序

热门文章

  1. oracle 修索引改空间_记一次Oracle分区表全局索引重修的历程
  2. java package private,Java中的public,protected,package-private和private有什么区别?
  3. 如何对单手和双手协同运动方向进行神经表征和解码?北理工研究团队给出了相关方案
  4. 人民大学提出听音识物AI框架,不用人工标注,嘈杂环境也能Hold住,还可迁移到物体检测...
  5. 名校华人教授专门设局诈骗中国留学生,4年吸金超百万美元,连亲戚也没放过...
  6. 可以装在手机里的3D姿态估计,模型尺寸仅同类1/7,平均关节位置误差却只有5厘米 | CPVR 2021...
  7. 英特尔中国换帅,迎来史上首位女董事长,原总裁杨旭年底退休
  8. 百度ACE智能交通能提升最高30%城市通行效率,刚刚拿下世界互联网大会最高荣誉...
  9. 写代码、搜问题,全部都在「终端」完成!如此编程神器,是时候入手了
  10. 禾多推出高精度定位和自动驾驶验证平台!倪凯:助力行业量产,定位中国向导...