分组后的Laravel雄辩求和元素

时间:2019-01-12 19:34:54

标签: laravel group-by eloquent sum

我在Laravel中有一个两层的小组,想对每个最后一组的数目求和。

该模型类似于:

Plan
=====================
id | user_id | game_id | option | amount

我的查询是:

$allbets = DB::table('plan')
            ->select('plan.amount', 'plan.option', 'users.name')
            ->join('users', 'plan.user_id', '=', 'users.id')
            ->where(['plan.game_id' => $game->id])
            ->get()
            ->groupBy('name')
            ->map(function ($option) {
                return $option
                    ->groupBy('option');
            })
        ;

我需要总结每个第二级“选项”组的“金额”。 实际结果是:

username1 =>
   option1 =>
      0 =>
          username1
          option1
          10
      1 =>
          username1
          option1
          12

username2 =>
   option1 =>
      0 =>
          username2
          option1
          10
      1 =>
          username1
          option1
          12
   option2 =>
      0 =>
          username2
          option2
          5
      1 =>
          username1
          option2
          6

我需要这个结果:

username1 =>
   option1 =>
          22

username2 =>
   option1 =>
          22
   option2 =>
          11

1 个答案:

答案 0 :(得分:0)

您可以使用laravel reduce()方法https://laravel.com/docs/5.7/collections#method-reduce

在地图功能内部,在分组之后添加reduce,如下所示:

->map(function ($option) {
    return $option
        ->groupBy('option')
        ->map(function($group) {
           // Loop through each group and reduce them.
           $group->reduce(function($carry, $item) {
                // Assume that we always want the last value by using php end() function on array.
                return $carry + end($item);
           }, 0);
        });

});

我还没有测试过,所以如果有问题让我知道,我会更新答案。