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?

Respuestas:


212

Esto es trabajo para mí:

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

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();

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();

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!


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');

5
  1. Abierto config/database.php
  2. Encuentra la strictclave dentro de la mysqlconfiguración de conexión
  3. Establezca el valor en false

1

Prueba con esto

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

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();
}

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();

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.