Livewire和Eloquent-过滤集合中多列的总和



在Laravel和Livewire中是一个很好的例子,我想如果有更好的方法来实现我在这里所拥有的:

我在Livewire视图中有一些复选框,允许用户动态选择如何过滤HTML表中显示的数据。在控制器上,我有一个雄辩的查询,每当复选框更改状态时,它都会检索数据库中记录的子集。像这样(我试图简化结构(:

$filtered_items = Item::select('item_color', 'item_quantity', 'item_value')
        ->whereIn('item_color', [ /* array controlled by checkboxes values in view */ ])
        ->get();

我还需要显示特定过滤器设置的一些列的总和。由于我不想进行新的查询,我尝试对已经可用的集合进行处理,并为我想要求和的每列使用->sum()

$sums['item_quantity'] = $filtered_items->sum('item_quantity');
$sums['item_value'] = $filtered_items->sum('item_value');

它按预期工作,因为我有一个带和的数组,但我想知道是否有更好的方法可以做到这一点,甚至可以编写一个函数来同时获得更多列的和,也许可以传递一个数组。

谢谢你的任何想法或链接!

下面是一个针对所有总和(本例中为两个(的单个查询的示例

$filtered_items = DB::table('items')
        ->selectRaw('SUM(item_quantity) as sum_quantity, SUM(item_value) as sum_value')
        ->whereIn('item_color', [ /* array controlled by checkboxes values in view */ ])
        ->first();

优点是它将返回一个条目/行,而不是所有项的集合,这要快得多。

最新更新