如何使用 groupBy() 对 Collection 对象进行分组

Posted

技术标签:

【中文标题】如何使用 groupBy() 对 Collection 对象进行分组【英文标题】:How to use groupBy() to group a Collection object 【发布时间】:2021-11-22 16:27:00 【问题描述】:

我的目标是检索用户的所有“项目”,然后按他们的“状态”分组显示在我的视图中。有 4 种可能的状态,每种状态在包含项目信息的页面上都有自己的<div>。经过一番摸索,我相信我需要像这样使用groupBy() 方法:

$items = Item::ownedBy( Auth::id() )->groupBy('status')->get();

这似乎确实进行了某种分组,但是当我遍历集合时,我最多得到 4 个结果,每个状态一个。这并不能真正解决我的问题,因为我需要显示每个状态的所有用户项目,而不仅仅是一个。我必须在这里遗漏一些东西,我真的很想避免对每个状态进行查询并以这种方式显示它们。我想我可以按状态过滤集合并创建 4 个新集合,但这不是 groupBy() 应该做的吗?

【问题讨论】:

SQL GROUP BY status 将所有具有相同 status 的行聚合到一行中,所以这不是您想要的。 谢谢@ceejayoz 我有一种感觉,我可能会走错路。那么,过滤成 4 个不同的集合/数组会是最佳做法吗? 【参考方案1】:

你可以使用 laravel 和 Collections 轻松做到这一点。 Collections 有强大的 API 和很多方便的方法,可以轻松实现你想要的。

您的错误是您在 QueryBuilder 对象上调用 groupBy ,该对象仅返回按数据库中的记录分组。相反,您必须选择所有需要的记录,然后它们将作为集合返回。之后,您可以根据需要操作集合。所以你需要的是:

$items = Item::ownedBy( Auth::id() )->get()->groupBy('status');

你可以查看Colletion类的所有有用方法here。

【讨论】:

谢谢,这是有道理的。然后我将如何显示分组数据?我找不到任何关于如何使用 groupBy 来分组和显示数据组的文档。 @JoshMountain 您可以查看class reference。 groupBy 返回一个集合对象,然后您可以像数组一样循环遍历它。您可以通过 var_dump 集合来查看结构。

以上是关于如何使用 groupBy() 对 Collection 对象进行分组的主要内容,如果未能解决你的问题,请参考以下文章

pandas 如何使用 groupby 在标签中按日期对列进行分组?

如何将 groupBy 与 MagicalRecord 一起使用?

如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?

如何使用pandas groupby对一些行降序和一些行升序排序

SQL多个字段如何去重

pandas如何对value列数据进行分组groupby?