Элементы Laravel Eloquent Sum после groupBy - PullRequest
0 голосов
/ 12 января 2019

У меня двухуровневая группа в 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 голосов
/ 12 января 2019

Вы можете использовать метод laravel reduce() https://laravel.com/docs/5.7/collections#method-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);
        });

});

Я не проверял это, поэтому, если есть проблемы, дайте мне знать, и я обновлю ответ.

...