2015-05-26 2 views
10

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

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

ответ

4

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

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

спасибо! Это возвращает данные, сгруппированные правильно, но не включает ключи (perform_at_year_month, performer_id) в строке json. Можете ли вы порекомендовать это решение? –

+0

Я обновил свой ответ. – user3158900

+0

Большой ответ помог мне! Upvoting. – kevinabraham

18

Раствор в https://stackoverflow.com/a/30469061/221745 можно улучшить на я думаю. Ключ должен помнить, что сгруппированные по коллекции - это коллекция коллекций. Таким образом, следующие будут работать:

<?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 содержит окончательный результат

Смежные вопросы