Laravel集合按组分组

15

我有一个搜索功能,可以按照特定的日期、月份、字符串等搜索支出,并返回一个集合:

enter image description here

目前为止还不错。我可以显示所有返回的 Expenses。现在,我想要做的是,按 description_id 分组显示总支出计数和总金额。如果我只是简单地执行 $result->groupBy('description_id'),那么我只会得到一组集合,无法显示描述的名称。以下是我想要的示例:

Grouped Results (By Expense):

Description Name: <-- Issue displaying this
Total Expenses: 3
Total Amount: 53444

只有通过 ExpenseDescription 之间的关系才能获得描述名称。一个费用属于一个描述。

在处理我的集合时,是否可能实现我想要的结果,或者应该执行单独的查询来获取这些结果?(不希望这样)


2
我认为你应该在查询级别上执行此操作,而不是在返回的集合上执行。你可以简单地调用 DB::select('SUM(expenses) as total_expenses', 'SUM(amount) as total_amount')..然后稍后,使用 groupBy('description_name') - Ohgodwhy
我会试一试,因为这似乎是最明显的事情,我猜 :) - Hardist
1
也许你可以只是急切地加载描述,这样当你有集合时,你就有了一个嵌套的对象/数组描述,可以在groupBy之后访问。 - Oluwatobi Samuel Omisakin
1个回答

34

如果你急切地预加载 description,那么你可以将所得到的集合按集合中嵌套对象进行分组。因此你可能会有:

$expenses = Expenses::with('description')->get(); //collection

然后对它进行分组:

$grouped = $expenses->groupBy('description.name'); 
//or
$grouped = $expenses->groupBy('description_id'); 

那么您可以使用名称或描述,访问它,比如我们需要第一组中的第一项开支,

$description_name = $grouped
                    ->first() //the first group
                    ->first() //the first expense in group
                    ->description //the description object
                    ->name //the name

这只是一个简单的证明,说明你可以获取集合中相关模型的名称并使用它来解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接