Laravel Eloquent groupBy () AND 또한 각 그룹의 개수를 반환합니다.


104

다른 열 중에서 브라우저 버전 열이 포함 된 테이블이 있습니다. 그리고 기록 세트에서 각 유형의 브라우저에 몇 개가 있는지 알고 싶습니다. 따라서 다음과 같이 끝낼 필요가 있습니다. Total Records : 10; Internet Explorer 8 : 2; 크롬 25 : 4; Firefox 20 : 4. (모두 10 개까지 추가)

여기 내 두 펜스가 있습니다.

$user_info = Usermeta::groupBy('browser')->get();

물론 여기에는 각 브라우저 수가 아니라 3 개의 브라우저 만 포함되어 있습니다. 어떻게 할 수 있습니까?

답변:


211

이것은 나를 위해 일하고 있습니다.

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();

1
훌륭한! select에 'browser'를 추가하여 select ( 'browser', ...)하고 필요한 모든 것을 얻었습니다. 당신은 훌륭합니다! youtube.com/watch?v=ravi4YtUTxo
kJamesy 2013-08-30

감사. 하지만 User :: select ( 'country', DB :: raw ( 'count (*) as total')-> otherMethods ()와 같은 모델과 함께 사용할 때 왜 작동하지 않습니까?
doncadavona

1
+ v. 컨트롤러에서 DB 대신 \ DB 사용
Amit Bera

@AmitBera 당신은 이유? 제발 설명 할 수
JCarlosR

8
당신이 선호하는 특별한 이유 DB::table('usermetas')->..Usermeta::..있습니까?
아담

33

이것은 나를 위해 작동합니다 (Laravel 5.1) :

$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();

22

감사합니다 Antonio,

lists마지막에 명령을 추가 했으므로 키와 개수가있는 하나의 배열 만 반환됩니다.

라 라벨 4

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser');

라 라벨 5.1

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser')->all();

Laravel 5.2 이상

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->pluck('total','browser')->all();

1
감사. 참고 : 5.1 예제의-> all ()은 이미 결과를 나열 했으므로 제거해야합니다.
Pim

1
list()더 이상 사용되지 않으며 pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0으로
Arun Code

12

콜렉션을 얻으려면 groupBy 및 count :

$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();

건배!


9

그런 식으로도 작동하며 조금 더 깔끔합니다. getQuery()이미 테이블 참조를 포함하는 기본 빌더를 반환합니다.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');


1

이것으로 시도

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))

2
이것이 질문에 답할 수는 있지만 대답의 필수 부분과 OP 코드의 문제점을 설명하는 것이 좋습니다.
pirho

1

다음은 원시 문을 사용할 필요없이 그룹을 처리하는 더 많은 라 라벨 방법입니다.

$sources = $sources->where('age','>', 31)->groupBy('age');

$output = null;
foreach($sources as $key => $source) {
    foreach($source as $item) {
        //get each item in the group
    }
    $output[$key] = $source->count();
}

7
이것은 메모리와 배고픈 처리입니다.
doncadavona

나를위한 동일한 메모리 pb
Vince

0

정렬 된 데이터를 얻으려면 이것을 사용하십시오.

$category_id = Post::orderBy('count', 'desc')->select(DB::raw('category_id,count(*) as count'))->groupBy('category_id')->get();

0
$post = Post::select(DB::raw('count(*) as user_count, category_id'))->groupBy('category_id')->get();

카테고리 별 게시물 수를 계산 한 예입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.