2015-05-26 28 views
10

Sto provando a raggruppare una collezione con due clausole in Laravel 5, ma la raggruppa solo per la prima. Qualcuno può aiutarmi? Ecco il mio codice.Multiple groupBy su Laravel Collection

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

risposta

4

È possibile provare a concatenarli, tuttavia non sono sicuro che otterrà i risultati desiderati. Consiglia di controllare per essere sicuri

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

Ho appena controllato questo e si sono corretti, non è conservare le chiavi, anche se credo di poter immaginare il perché. Se una chiave sembra essere la stessa, le cose verranno sovrascritte. Potrebbe anche essere difficile determinare quale chiave è ciò che, nel complesso, si sente un po '"hacky" in cui è probabile che esista una soluzione molto migliore.

Tuttavia, penso di aver capito come farlo.

$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); 
+0

Grazie! Ciò restituisce correttamente i dati raggruppati, ma non include le chiavi (played_at_year_month, performer_id) sulla stringa json. Puoi raccomandare una correzione per questo? –

+0

Ho aggiornato la mia risposta. – user3158900

+0

Ottima risposta mi ha aiutato! Upvoting. – kevinabraham

18

La soluzione in https://stackoverflow.com/a/30469061/221745 può essere migliorata sul credo. La chiave è ricordare che una raccolta raggruppata per collezione è una raccolta di collezioni. Pertanto, il seguente funziona:

<?php 

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

Dove $grouped contiene il risultato finale