Laravel Eloquent groupBy () Y también devuelve el recuento de cada grupo

105

Tengo una tabla que contiene, entre otras columnas, una columna de versiones del navegador. Y simplemente quiero saber por el conjunto de registros, cuántos de cada tipo de navegador hay. Entonces, necesito terminar con algo como esto: Total Records: 10; Internet Explorer 8: 2; Cromo 25: 4; Firefox 20: 4 (todos sumando 10)

Aquí están mis dos peniques:

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

Por supuesto que solo contiene los 3 navegadores y no el número de cada uno. ¿Cómo puedo hacer esto?

kJamesy
fuente

Respuestas:

212

Esto es trabajo para mí:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
Antonio Carlos Ribeiro
fuente
1
¡Magnífico! Acabo de agregar 'navegador' a la selección así: seleccione ('navegador', ...) y obtuve todo lo necesario. ¡Eres bueno, tú! youtube.com/watch?v=ravi4YtUTxo
kJamesy
Gracias. Pero, ¿por qué no funciona cuando se usa con modelos como User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona
1
+ v. use \ DB en lugar de DB en los controladores
Amit Bera
@AmitBera, ¿puedes explicar la razón ?, por favor
JCarlosR
8
¿Hay alguna razón en particular por lo prefiere DB::table('usermetas')->..más Usermeta::..?
Adam
33

Esto funciona para mí (Laravel 5.1):

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

Gracias Antonio,

Acabo de agregar el listscomando al final, por lo que solo devolverá una matriz con clave y recuento:

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
fuente
1
Gracias. Una nota: -> all () en el ejemplo 5.1 debe eliminarse, ya que ya enumera los resultados.
Pim
1
list()está en desuso y se renombra a pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Código Arun
12

Si desea obtener una colección, groupBy y count:

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

¡Salud!

Adam Kozlowski
fuente
9

Funciona de esa manera también, un poco más ordenado. getQuery()simplemente devuelve el constructor subyacente, que ya contiene la referencia de la tabla.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
Yauheni Prakopchyk
fuente
5
  1. Abierto config/database.php
  2. Encuentra la strictclave dentro de la mysqlconfiguración de conexión
  3. Establezca el valor en false
Boris Tetřev
fuente
1

Prueba con esto

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
Jasim Juwel
fuente
2
Si bien esto puede responder a la pregunta, es mejor explicar las partes esenciales de la respuesta y posiblemente cuál fue el problema con el código de OP.
pirho
1

Aquí hay una forma más Laravel de manejar el grupo sin la necesidad de usar declaraciones sin formato.

$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
fuente
7
Esto es memoria y procesamiento hambrientos.
doncadavona
Mismo pb de memoria para mí
Vince
0

Si desea obtener datos ordenados, use esto también

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

Este es un ejemplo cuyos resultados cuentan las publicaciones por categoría.

Yuvraj Hinger
fuente