【问题标题】:How to use groupBy() to group a Collection object如何使用 groupBy() 对 Collection 对象进行分组
【发布时间】: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 个不同的集合/数组会是最佳做法吗?

标签: php laravel group-by laravel-collection


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,这是有道理的。然后我将如何显示分组数据?我找不到任何关于如何使用 groupBy 来分组和显示数据组的文档。
  • @JoshMountain 您可以查看class reference。 groupBy 返回一个集合对象,然后您可以像数组一样循环遍历它。您可以通过 var_dump 集合来查看结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2018-05-01
  • 2015-10-19
相关资源
最近更新 更多