2015-05-26 19 views
10

Tôi đang cố gắng nhóm một bộ sưu tập theo hai mệnh đề trong Laravel 5, nhưng nó chỉ nhóm nó theo thứ tự đầu tiên. Ai đó có thể giúp tôi không? Đây là mã của tôi.Nhiều nhómBởi trên Bộ sưu tập Laravel

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

Trả lời

4

Bạn có thể thử xâu chuỗi chúng, tuy nhiên tôi không chắc nó sẽ mang lại kết quả bạn muốn. Thể muốn kiểm tra để chắc chắn

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

tôi chỉ kiểm tra này và bạn là chính xác, nó không giữ gìn chìa khóa, mặc dù tôi nghĩ rằng tôi có thể đoán lý do tại sao. Nếu một khóa xảy ra giống nhau, mọi thứ sẽ bị ghi đè. Nó cũng có thể là khó khăn để xác định chìa khóa là gì và tổng thể cảm thấy một chút "hacky", nơi có khả năng là một giải pháp tốt hơn nhiều.

Tuy nhiên, tôi nghĩ tôi đã tìm ra cách thực hiện điều này.

$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

Cảm ơn! Điều này trả về dữ liệu được nhóm chính xác, nhưng nó không bao gồm các khóa (perform_at_year_month, performer_id) trên chuỗi json. Bạn có thể đề nghị sửa chữa cho điều đó không? –

+0

Tôi đã cập nhật câu trả lời của mình. – user3158900

+0

Câu trả lời tuyệt vời đã giúp tôi! Upvoting. – kevinabraham

18

Giải pháp trong https://stackoverflow.com/a/30469061/221745 có thể được cải thiện theo tôi nghĩ. Điều quan trọng là phải nhớ rằng một nhóm theo bộ sưu tập là một tập hợp các bộ sưu tập. Vì vậy, sau đây sẽ làm việc:

<?php 

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

đâu $grouped chứa kết quả cuối cùng của bạn

Các vấn đề liên quan