Laravel Группа сбора По множеству и усреднению элемента во второй группе - PullRequest
1 голос
/ 08 июля 2020

Я успешно использую groupBy в своем запросе для группировки по двум элементам.

Это код:

App\Groupshot::findOrNew(4)
    ->load('snapshots.answers.question.tags','snapshots.participant')
    ->answers->groupBy([
        function ($item, $key) {
            return [$item->question->tags()->first()->name];
        },
        function ($item, $key) {
            return [$item->participant->id];
        },
    ]);

Я ранее использовал map () вместе с groupBy для суммирования сгруппированный элемент. В этом случае я хочу суммировать балл за ответ (ответ). Я изо всех сил пытаюсь применить этот подход ко второй сгруппированной коллекции при использовании выше. 1011 *

=> Illuminate\Support\Collection {#2542
     all: [
       "FEAR" => 6,
       "RAGE" => 22,
       "PANIC/GRIEF" => 2,
       "PLAY" => 3,
     ],
   }

То, что я ищу .. суммируйте вторую группу по вложенному запросу ...

=> Illuminate\Support\Collection {#2542
     all: [
       "FEAR" => [Bob => 5, Bill => 2, Ben => 1 ],
       "RAGE" => [Bob => 2, Bill => 1, Ben => 1 ],
       "PANIC/GRIEF" => [Bob => 4, Bill =>3, Ben => 4 ],
       "PLAY" => [Bob => 5, Bill =>3, Ben => 1 ],
     ],
   }

1 Ответ

1 голос
/ 09 июля 2020

Огромное спасибо @Michael в комментариях за то, что указал мне в этом направлении. По его мнению, помогло разбиение этого на части, а затем обертывание вспомогательной группировки и суммы во второй карте.

Это прекрасно. Вот код:

App\Groupshot::findOrNew(4)
    ->load('snapshots.answers.question.tags', 'snapshots.participant')
    ->answers->groupBy([
        function ($item, $key) {
            return [$item->question->tags()->first()->name];
        },
    ])
    ->map(function ($row) {
        return $row
            ->groupBy([
                function ($item, $key) {
                    return [$item->participant->FullName];
                },
            ])
            ->map(function ($row) {
                return $row->sum('answer');
            });
    });

и результат

=> Illuminate\Support\Collection {#4354
     all: [
       "FEAR" => Illuminate\Support\Collection {#3670
         all: [
           "Gavin Ellis" => 6,
           "Naomi Lloyd" => 10,
           "Jonathan Walsh" => 18,
           "Reece Kelly" => 17,
           "Connor Wood" => 3,
           "Keith Price" => 4,
           "Joe Phillips" => 5,
           "Bradley Clarke" => 6,
           "Superadministrator Superadministrator" => 6,
           "Elsie Reynolds" => 12,
         ],
       },
       "RAGE" => Illuminate\Support\Collection {#3972
         all: [
           "Gavin Ellis" => 22,
           "Naomi Lloyd" => 10,
           "Jonathan Walsh" => 12,
           "Reece Kelly" => 29,
           "Connor Wood" => 13,
           "Keith Price" => 10,
           "Joe Phillips" => 17,
           "Bradley Clarke" => 25,
           "Superadministrator Superadministrator" => 6,
           "Elsie Reynolds" => 10,
         ],
       },
...