Подтвердить что ты не робот

Несколько групп в Laravel Collection

Я пытаюсь сгруппировать коллекцию двумя предложениями в Laravel 5, но она группирует ее только по первой. Может кто-нибудь, пожалуйста, помогите мне? Вот мой код.

$query = Activity::all()->groupBy('performed_at_year_month', 'performer_id')->toJson();
4b9b3361

Ответ 1

Решение в fooobar.com/questions/552645/... может быть улучшено, я думаю. Ключ должен помнить, что сгруппированные по коллекции - это коллекция коллекций. Поэтому будет работать следующее:

<?php

$recs = new \Illuminate\Database\Eloquent\Collection($query);
$grouped = $recs->groupBy('performed_at_year_month')->transform(function($item, $k) {
    return $item->groupBy('performer_id');
});

Где $grouped содержит окончательный результат

Ответ 2

Вы можете попытаться связать их, однако я не уверен, что вы получите нужные вам результаты. Может захотеть проверить, чтобы быть уверенным

$query = Activity::all()->groupBy('performed_at_year_month')->groupBy('performer_id')->toJson();

Я только что проверил это, и вы правы, он не сохраняет ключи, хотя я думаю, что могу догадаться, почему. Если ключ окажется таким же, все будет перезаписано. Также может быть трудно определить, какой ключ является тем, что и в целом чувствует себя немного "взломанным", где, вероятно, существует гораздо лучшее решение.

Однако, я думаю, что я понял, как это сделать.

$query = Activity::all();
$activities = new \Illuminate\Database\Eloquent\Collection($query);
$activities = $activities->groupBy('performed_at_year_month')->toArray() + $activities->groupBy('performer_id')->toArray();
echo json_encode($activities);

Ответ 3

Вместо передачи строкового ключа вы можете передать обратный вызов. Обратный вызов должен вернуть значение, которое вы хотите ввести в группу:

$collection->groupBy(function($item, $key){
            return $item["key-1"]."-".$item["key-2"];
        });

Ссылка: - https://laravel.com/docs/5.7/collections#method-groupby