【问题标题】:Livewire and Eloquent - Sums of multiple columns in filtered collectionLivewire 和 Eloquent - 过滤集合中多列的总和
【发布时间】:2021-12-30 15:14:49
【问题描述】:

在 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');

它按预期工作,因为我有一个包含总和的数组,但我想知道是否有更好的方法来做到这一点,或者甚至编写一个函数来一次获取更多列的总和,也许传递一个数组。

感谢您提供任何想法或链接!

【问题讨论】:

  • 您需要查询返回的 items/item_colors 还是只需要总和?
  • 理想情况下是一个以列名作为键,然后将整列的总和作为值的数组

标签: laravel eloquent laravel-livewire


【解决方案1】:

这是一个查询所有总和的示例(本例中为两个)

$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();

优点是它会返回一个条目/行而不是所有项目的集合,这样更快。

【讨论】:

  • N69S 我看到你的回答,我想我没有正确解释。对于我的第一个查询,我仍然需要所有过滤后的项目详细信息。在第一个查询之后运行第二个查询比处理已经检索到的集合更快?
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2014-01-22
  • 2017-04-12
  • 2019-07-25
相关资源
最近更新 更多