web-dev-qa-db-fra.com

Groupe multiple par dans Laravel Collection

J'essaie de regrouper une collection en deux clauses dans Laravel 5, mais elle ne la groupe que par la première. Quelqu'un peut-il m'aider s'il vous plaît? Voici mon code.

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

La solution dans https://stackoverflow.com/a/30469061/221745 peut être améliorée à mon avis. La clé est de se rappeler qu’une collection par collection est une collection de collections. Par conséquent, ce qui suit fonctionnera:

<?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 contient votre résultat final

29
Erik

Vous pouvez essayer de les chaîner, mais je ne suis pas sûr que cela vous donnera les résultats souhaités. Peut vouloir vérifier pour être sûr

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

Je viens de vérifier cela et vous avez raison, cela ne conserve pas les clés, bien que je puisse deviner pourquoi. Si une clé est identique, les choses seront écrasées. Il pourrait également être difficile de déterminer quelle clé correspond à quoi et se sent globalement un peu "hacky" où il y a probablement une solution bien meilleure.

Cependant, je pense avoir compris comment faire cela.

$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);
6
user3158900

Au lieu de passer une clé de chaîne, vous pouvez passer un rappel. Le rappel doit renvoyer la valeur que vous souhaitez utiliser pour le groupe:

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

Référence: - https://laravel.com/docs/5.7/collections#method-groupby

0
Bomjon Bedu