首页 > 解决方案 > Laravel groupBy 值并以 groupBy 值为 key 存储另一个值的总和

问题描述

对不起,冗长的标题,我只是不确定如何准确地表达我正在尝试做的事情。

所以我有一张这样的航班表。

id | user_id | orig | dest | value    |
=======================================
1  |    1    | LHR  | WLG  | 34000.00 |
2  |    1    | LHR  | WLG  | 47000.00 |
3  |    1    | LHR  | AKL  | 22000.00 |

我想要的是一个目的地数组('dest'),其中包含该目的地的任何记录的值的总和。

我目前正在使用 Eloquent 来提取记录,然后在 groupBy 上'dest'

$transactions =  AirTran::select('orig','dest','value')->where('user_id','1')->get();

$group_tran = $transactions->groupBy('dest');

不幸的是,这将返回数组中的每一行,而不是值的总和:

WLG:
    0:
       orig: 'LHR'
       dest: 'WLG'
       value: '34000.00'
    1:
       orig: 'LHR'
       dest: 'WLG'
       value: '47000.00'
AKL:
    0:
       orig: 'LHR'
       dest: 'AKL'
       value: '22000.00'

但我真正想要的是:

WLG:
    0:
       orig: 'LHR'
       dest: 'WLG'
       value: '81000.00'
AKL:
    0:
       orig: 'LHR'
       dest: 'AKL'
       value: '22000.00'

'value'有没有办法使用 Eloquent 而不是使用 PHP来获取列的总和,如下所示:

foreach($transactions as $transaction) {

   if(isset($data[$transaction->dest]['revenue'])){
       $data[$transaction->dest]['revenue'] += $transaction->value;
    } else {
       $data[$transaction->dest]['revenue'] = $transaction->value;
    }
}

标签: laraveleloquent

解决方案


您可以使用 eloquant 的函数 sum。您的代码可以是:

$transactions = AirTran::select('orig','dest','value')->where('user_id','1')->get();

$group_tran = $transactions->groupBy('dest') ->sum('value');

或直接使用一个命令:

$group_tran= AirTran::select('orig','dest','value')->where('user_id','1')
                       ->sum('value')
                       ->groupBy('dest')
                       ->where('user_id','1')
                       ->get();

推荐阅读