Laravel Eloquent groupBy () E também retorna a contagem de cada grupo

104

Tenho uma tabela que contém, entre outras colunas, uma coluna de versões de navegador. E eu simplesmente quero saber pelo conjunto de registros quantos de cada tipo de navegador existem. Então, eu preciso terminar com algo assim: Total de registros: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (Todos somando até 10)

Aqui estão meus dois pence:

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

Claro que contém apenas os 3 navegadores e não o número de cada um. Como posso fazer isso?

kJamesy
fonte

Respostas:

211

Isso está funcionando para mim:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
Antonio Carlos Ribeiro
fonte
1
Excelente! Basta adicionar 'navegador' ao select assim: select ('navegador', ...) e tem tudo que você precisa. Você é bom, você! youtube.com/watch?v=ravi4YtUTxo
kJamesy
Obrigado. Mas por que não funciona quando usado com modelos como User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona
1
+ v. use \ DB em vez de DB nos controladores
Amit Bera
@AmitBera você pode explicar o motivo ?, por favor
JCarlosR
8
Existe alguma razão específica para que você preferir DB::table('usermetas')->..mais Usermeta::..?
Adam,
33

Isso funciona para mim (Laravel 5.1):

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

Obrigado Antonio,

Acabei de adicionar o listscomando no final para que ele retorne apenas uma matriz com chave e contagem:

Laravel 4

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

Laravel 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();
Diogo gomes
fonte
1
Obrigado. Uma nota: -> all () no exemplo 5.1 deve ser removido, uma vez que você já lista os resultados.
Pim
1
list()foi descontinuado e renomeado para pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Arun Code
12

Se você deseja obter a coleção, groupBy e contar:

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

Felicidades!

Adam Kozlowski
fonte
9

Funciona assim também, um pouco mais arrumado. getQuery()apenas retorna o construtor subjacente, que já contém a referência da tabela.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
Yauheni Prakopchyk
fonte
5
  1. Abrir config/database.php
  2. Encontre a strictchave dentromysql configurações de conexão
  3. Defina o valor para false
Boris Tetřev
fonte
1

Tente com isso

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
Jasim Juwel
fonte
2
Embora isso possa responder à pergunta, é melhor explicar as partes essenciais da resposta e, possivelmente, qual era o problema com o código de OPs.
pirho
1

Aqui está uma maneira mais Laravel de lidar com group by sem a necessidade de usar instruções brutas.

$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();
}
Vulfoliac
fonte
7
Isso é memória e processamento com fome.
doncadavona
Mesma memória pb para mim
Vince
0

Se você quiser obter dados classificados, use também

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

Este é um exemplo cujos resultados contam de postagem por categoria.

Yuvraj Hinger
fonte